首页 > 解决方案 > 递归斐波那契 NASM

问题描述

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

代码:

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


标签: assemblyx86x86-64nasm

解决方案


推荐阅读