Функция Фибоначчи с плавающей точкой в ​​ассемблере x86 - PullRequest
2 голосов
/ 01 апреля 2012

Я написал это, но это не работает (вылетает при n> 6):

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, с которым мне приходится иметь дело.

1 Ответ

2 голосов
/ 01 апреля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...