_fibonacci:
push ebp
mov ebp, esp
sub esp, 4
Вы используете память, EAX
не вкладывая в нее что-то полезное! Вы должны зарезервировать это пространство в своей пролог функции:
EAX
Возвращаясь с первого рекурсивного вызова, вы положили результат из EDX
этого словаря памяти.
Возвращаясь со второго рекурсивного вызова, вы добавляете к EBX
содержимому этого словаря памяти.
Таким образом, EAX
регистр больше не будет сбиваться.
Почему вы используете EBX
регистр вообще? Если вы используете его, вы должны сохранить его, как было объяснено в ответе Аль Кеппа .
Если вы начнете с ввода аргумента EAX
, вы знаете, что для обоих значений ниже 2 (так что 0 и 1) результат будет равен аргументу. Просто.
mov eax, [ebp+8] ;; param n
cmp eax, 2
jb _endFIbofunc
Если вы не балансируете стек сразу после первого рекурсивного вызова, вы можете просто уменьшить двоеточие, которое уже существует, и сделать второй рекурсивный вызов.
dec eax ; n-1
push eax ;(*)
call _fibonacci
mov [ebp-4], eax
dec dword ptr [esp] ; n-2
call _fibonacci
add esp,4 ;(*)
add eax, [ebp-4]
Весь процесс:
_fibonacci:
push ebp
mov ebp, esp
sub esp, 4 ;(*)
mov eax, [ebp+8] ;; param n
cmp eax, 2
jb _endFIbofunc
dec eax ; n-1
push eax ;(*)
call _fibonacci
mov [ebp-4], eax
dec dword ptr [esp] ;(*) n-2
call _fibonacci
add esp,4 ;(*)
add eax, [ebp-4]
_endFIbofunc:
mov esp, ebp
pop ebp
ret