[嗨,我使用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 ...
您正确地在f
中设置了堆栈帧,但随后由于添加了rbp
而开始出错。您应该不理会rbp
,而是将偏移量添加到变量fetch上: