【问题标题】:Why do I have a segmentation fault in recursive assembly function?为什么我在递归汇编函数中有分段错误?
【发布时间】:2020-03-08 15:25:34
【问题描述】:

您好,我使用 amd64 abi 调用约定在汇编中编写了斐波那契递归代码,但我总是遇到分段错误:/ 我编译它:

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


【问题讨论】:

    标签: assembly stack x86-64 stack-frame


    【解决方案1】:

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

    push rdi
    move rdi,[rbp+16]
    

    您的退出顺序错误。在条目中添加 16 到 rbp 是这里的问题(通过不更改 rbp 解决)并且您将rsp 恢复在错误的位置。

    pop rdi
    mov rsp,rbp    ; Unnecessary here (see below)
    pop rbp
    ret
    

    但是,由于您永远不会更改 rsp 来为局部变量分配存储空间,因此移动到 rsp 是不必要的,可以省略。

    请注意,与进入/退出顺序和崩溃无关的代码还有其他问题。

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多