Assembly 递归Fibonacci-NASM

Assembly 递归Fibonacci-NASM,assembly,x86,x86-64,nasm,Assembly,X86,X86 64,Nasm,我试图在汇编中编写一个递归斐波那契函数,但我不确定我是否知道我在做什么。到目前为止,这就是我所拥有的,但我有错。 代码从用户处获取一个数字,然后计算该数字,因此,如果n=9,则输出为34 代码: mov-eax,n应该是mov-eax,[n]。。您希望加载的是值,而不是地址。PS:学习使用调试器。对fib\n的初始调用是在错误的寄存器中传递参数。哦,是的,使用正确的寄存器也有帮助:D@PeterCordes但是n不是用于接收用户输入吗?这是一个四字,不是一个值为1的四字。@Michael:显然我

我试图在汇编中编写一个递归斐波那契函数,但我不确定我是否知道我在做什么。到目前为止,这就是我所拥有的,但我有错。 代码从用户处获取一个数字,然后计算该数字,因此,如果n=9,则输出为34

代码:


mov-eax,n
应该是
mov-eax,[n]
。。您希望加载的是值,而不是地址。PS:学习使用调试器。对
fib\n
的初始调用是在错误的寄存器中传递参数。哦,是的,使用正确的寄存器也有帮助:D@PeterCordes但是
n
不是用于接收用户输入吗?这是一个四字,不是一个值为1的四字。@Michael:显然我还没完全清醒。删除了我以前的评论。
extern printf, scanf
section .data

format db "%s %d",10,0
format2 db '%ld',0
format3 db "%s ",10,0
str1 db "Chose a number: ",0
str2 db "Result is: ",0

section .bss
n:      resq 1

section .text
global _start

_start:

        call print1 ;choose a number
        mov rdi, format2
        mov rsi, n
        mov rax, 0
        call scanf ;getting number
        
        mov eax, n
        call fib_n
        call print2 ;printing result

exit:   mov rax,60
        xor rdi, rdi
        syscall

fib_n:
    push    rdi
    xor     eax, eax
    cmp     edi, 2
    jb      end            ; fib(1) = 0                                                                                                                                                                     
    mov     eax, 1
    je      end            ; fib(2) = 1                                                                                                                                                                     
    dec     edi
    call    fib_n          ; -> EAX                                                                                                                                                                         
    push    rax            ; (1) Preserve intermediate result!                                                                                                                                              
    dec     edi
    call    fib_n          ; -> EAX                                                                                                                                                                         
    add     eax, [rsp]     ; fib(n) = fib(n-2) + fib(n-1)                                                                                                                                                   
    add     rsp, 8         ; (1)                                                                                                                                                                            
end:
    pop     rdi
    ret

print1:
        mov rdi, format3
        mov rsi,str1                                                                                                   
        mov rax,0
        call printf                                                                                                                                                               
        ret


print2:
        mov rdi,format                                                                                                                                                                    
        mov rsi, str2                                                                                                                                                                
        mov rdx, [n]
        mov rax,0
        call printf                                              \                                                                                                                
        ret