为什么在递归汇编函数中有分割错误?

问题描述 投票:0回答:1

[嗨,我使用amd64 abi调用约定在汇编中编写了Fibonacci递归代码,但是我总是遇到分段错误://我用以下方法编译它:

nasm -f elf64 -o fibo.o fibonacci.asm

ld -o fibo fibo.o

./ fibo

我没有编译错误,但是有分段错误,所以我想我的Stackframes出了点问题。

感谢您的帮助:)

SECTION .data

; define the fibonacci number that should be calculated
n:      dq   10

SECTION .text

global _start

_start:
    ; call Fibonacci function f(n)
    mov     rdi, [n]    ; parameter: fibonacci number to calculate
    call    f           ; call function

    ; print calculated Fibonacci number on stdout
    ;call    printnumber

    ; exit process with exit code 0
    mov     rax, 60
    mov     rdi, 0
    syscall

; f: Calculates a Fibonacci number
;   f(n) = {n, if n<=1; f(n-1)+f(n-2), else}.
;   Parameter: Integer n >= 0, passed on stack
;   Returns:   Fibonacci number f(n), returned in rax
f:
    push rbp            ; neuen stackframe
    mov rbp, rsp        
    push rdi            ; rdi auf stack speichern
    add rbp, 16         ; 
    mov rdi, [rbp]      ; rdi = parameter

    cmp rdi, 1          ; check for base case
    jle base            ; n <= 1

    dec  rdi            ; n-1
    push rdi
    call f              ; f(n-1)
    pop rdi

    dec  rdi            ; n-2
    push rdi
    call f              ; f(n-2)
    pop rdi
    pop rdi
    add rax, rdi

    jmp end
base: 
    mov rax, 1

end:
    pop rdi
    pop rbp
    mov rsp, rbp

    ret


[您好,我使用amd64 abi调用约定在汇编中编写了Fibonacci递归代码,但是我总是遇到分段错误:/我用以下命令编译它:nasm -f elf64 -o fibo.o fibonacci.asm ld -o fibo ...

assembly stack x86-64 stackframe
1个回答
2
投票

您正确地在f中设置了堆栈帧,但随后由于添加了rbp而开始出错。您应该不理会rbp,而是将偏移量添加到变量fetch上:

© www.soinside.com 2019 - 2024. All rights reserved.