2012-04-01 2 views
2

Я написал это, но он не работает (сбой при п> 6):функция Фибоначчи с поплавками в x86 ассемблере

section .data 
    one: dq 1.0 
    two: dq 2.0 

     section .text 
fib: 
    call print_float 
    fld qword [two] 
    fcomip 
    ja fin 
    fld st0  ; copy arg 
    fld qword [one] 
    fsub 
    call fib  ; st0=fib(n-1), st1=arg 
    fld st1 
    fld qword [two] 
    fsub 
    call fib  ; st0=fib(n-2), st1=fib(n-1), st2=arg 
    fadd   ; st0=fib(n-2)+fib(n-1), st1=arg 
    fstp st1  ; st0=fib(n-2)+fib(n-1) 
fin: 
    ret 

Что я делаю неправильно и/или как я должен делать это?

Примечание: Я знаю, что есть инструкция по загрузке 1.0. Я просто делаю это так для обеспечения последовательности, чтобы свести к минимуму подмножество x86, с которым мне приходится иметь дело.

+0

Пробовал ли вы один шаг по коду в отладчике? –

+0

@PaulR Я просто пишу x86 asm в Блокноте под Windows, компилируя с NASM, а затем связываюсь с GCC в оболочке MinGW. Я понятия не имею о лучших инструментах Windows. Чтобы вы посоветовали? –

+0

Я не пользователь Windows, но я знаю, что вы можете получить gdb как часть Cygwin, и я уверен, что на выбор также должно быть много других отладчиков Windows. Если вы собираетесь заниматься серьезным программированием, вам действительно нужно будет справиться с достойным отладчиком. –

ответ

2

Регистры FWU x87 действуют как стек, но их всего 8; и между записью до fib и первым call fib вы оставляете дополнительный элемент в стеке регистров FPU.

Вы должны использовать регистры FPU только по мере необходимости для выполнения вычислений. Используйте основной стек для хранения значений в рекурсивных вызовах.

+0

Argh, так очевидно. Благодаря! :-) –

Смежные вопросы