我正在Mac OS上使用x86-64程序集(使用NASM 2.09和2.13来捕获由NASM问题引起的错误)。我现在正在尝试实现函数调用,并尝试使用push
和pop
指令,但是pop
似乎总是导致段错误:
line 10: 41072 Segmentation fault: 11 ./result
我尝试手动调整rsp
,rbp
等,但是pop
似乎是问题所在。任何帮助,将不胜感激!
section .data
default rel
global start
section .text
start:
mov r12, 4
push r12
call label_0_print_digit
(some stuff to exit program)
label_0_print_digit:
pop r12
(some stuff to print the digit - the issue persists even without this)
ret
call
指令将返回地址放在堆栈中。 pop
指令从堆栈中删除返回地址(在您的代码中将其放入r12
)。然后,ret
指令尝试返回到地址4,该地址不是有效的代码地址,从而导致故障。
要访问堆栈上的函数的参数,请使用(rsp + 8)
,(rsp + 16)
等代替pop
。