Фибоначчи в NASM (с использованием платформы SASM)

#recursion #x86 #nasm #fibonacci #sasm

# #рекурсия #x86 #nasm #фибоначчи #sasm

Вопрос:

Я пытаюсь разработать алгоритм в NASM, который должен вычислять n-е число Фибоначчи. Я написал некоторый код, но при запуске он выводит только 1, и я не могу понять, почему. Моя идея состояла в том, чтобы вызвать Фибоначчи для n-1 и для n-2, где параметр n хранится в регистре AX, а результат сохраняется в BX.

 %include "io.inc"

section .text
global CMAIN
CMAIN:
    mov ebp, esp; for correct debugging
    xor eax, eax
    xor ebx, ebx
    push word 12
    call fibonacci
    pop word [trash]
    PRINT_UDEC 1, ax
    ret
    
fibonacci: push ebp
           mov ebp, esp
           
           mov ax, [ebp   8];se incarca ax cu parametrul primit prin stiva
           cmp ax, 0
           jne l1
           mov bx, 0
           jmp l3
l1:        cmp ax, 1
           jne l2
           mov bx, 1
           jmp l3
l2:        sub ax, 2;n-2
           push ax
           call fibonacci
           pop dx;resotre the stack
           mov [ebp - 2], bx
           
           mov ax, [ebp   8];se incarca bx cu parametrul prinit prin stiva
           sub ax, 1;n-1
           push ax
           call fibonacci
           pop dx;restore the stack
           add bx, [ebp - 2]
           
l3:        mov esp, ebp
           pop ebp
           ret
    
section .data
    trash dw 1
 

Комментарии:

1. Хотя я мог бы реализовать итерацию Фибоначчи, я хочу улучшить свои навыки в рекурсии сборки.

2. Отдельно от других ошибок, обычно вы не хотите использовать 16-битные нажатия в 32-битном режиме. Здесь вообще нет веских причин использовать 16-разрядные частичные регистры.