Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибка в коде на ассемблере

57K
16 февраля 2010 года
silencekiller
2 / / 16.02.2010
надо реализовать cos(x) через ряд тейлора на внешнем ассемблере. весь код уже написан и проверен, только не получается его вынести во внешний файл. vs2008 выдаёт ошибку "A tool returned an error code from "Assembling..."". вот содержимое файлов:
Код:
.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;
}

товарищи знатоки, помогите найти ошибку
16K
18 февраля 2010 года
asmforce
186 / / 05.01.2010
Вероятно проблема в возможной некорректности экспорта/импорта функции, - попробуйте поискать готовый код на asm! В vs2008 - Не знаю, а в Borland были в папке src! Там исходники всех функций, типа std::strlen ...
48K
21 февраля 2010 года
vasil211
11 / / 25.06.2009
Код очень плохо написан. Должно быть примерно так.
Цитата:

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

12K
21 февраля 2010 года
ASoftware
87 / / 16.04.2009
Цитата:
Код очень плохо написан.


Вероятно сгенерен vs2008 )

48K
21 февраля 2010 года
vasil211
11 / / 25.06.2009
Цитата:
Вероятно сгенерен vs2008 )



Нет, просто кто-то приложил свои неумелые ручки. Это уже понятно по первым двум строкам функции.

Цитата:

push ebp
mov ebp, esi



esi вместо esp.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог