.386
.model flat
.data
counter dw 0
x dq 0.0
eps dq 0.0
.code
public _cos_asm
_cos_asm proc
push ebp
mov ebp, esi
mov x, [ebp+8]
mov eps, [ebp+16]
finit
fldz
fld x
fmul x
fstp x
fld1
mov counter, 0
LS: fcom eps
fstsw ax
and ax, 0700h
cmp ah, 0
jne E
fadd st(1), st
fmul x
inc counter
fidiv counter
inc counter
fidiv counter
fcom eps
fstsw ax
and ax, 0700h
cmp ah, 0
jne E
fsub st(1), st
fmul x
inc counter
fidiv counter
inc counter
fidiv counter
jmp LS
E: fstp eps
pop ebp
ret
_cos_asm endp
end
ошибка в коде на ассемблере
Код:
Код:
#include <iostream>
using namespace std;
extern "C" double _cdecl cos_asm(double, double);
int main()
{
double x, eps, cos;
cin >> x >> eps;
cos = cos_asm(x, eps);
cout << cos;
return 0;
}
using namespace std;
extern "C" double _cdecl cos_asm(double, double);
int main()
{
double x, eps, cos;
cin >> x >> eps;
cos = cos_asm(x, eps);
cout << cos;
return 0;
}
товарищи знатоки, помогите найти ошибку
Вероятно проблема в возможной некорректности экспорта/импорта функции, - попробуйте поискать готовый код на asm! В vs2008 - Не знаю, а в Borland были в папке src! Там исходники всех функций, типа std::strlen ...
Цитата:
cos_asm proc angle,exp
LOCAL _x:REAL8
LOCAL _eps:REAL8
LOCAL Counter:DWORD
mov eax,angle
fld qword ptr [eax]
fstp _x
mov eax,exp
fld qword ptr [eax]
fstp _eps
finit
fldz
fld _x
fmul _x
fstp _x ;_x==_x^2
fld1
mov Counter,0
.while (TRUE)
fcom _eps ;eps сравнивается с еденицей в первый раз
fstsw ax
and ax,0700h
.break .if ah
fadd st(1),st
fmul _x
inc Counter
fidiv Counter
inc Counter
fidiv Counter ;в первый раз _x==_x/2!
fcom _eps
fstsw ax
and ax,0700h
.break .if ah
fsub st(1), st
fmul _x
inc Counter
fidiv Counter
inc Counter
fidiv Counter
.endw
fstp _eps
ret
cos_asm endp
Цитата:
Код очень плохо написан.
Вероятно сгенерен vs2008 )
Цитата:
Вероятно сгенерен vs2008 )
Нет, просто кто-то приложил свои неумелые ручки. Это уже понятно по первым двум строкам функции.
Цитата:
push ebp
mov ebp, esi
esi вместо esp.