我很困惑。我正在查看this页面,以了解如何使用堆栈将参数传递给函数。然而,我的代码并没有像预期的那样工作。假设我将计算结果放在rax中,我希望退出代码是9,但事实并非如此;相反,我的退出代码是150。是否有人了解x86中堆栈的调用约定,知道我做错了什么,以及如何实现我试图解决的问题?我正在用GAS在Mac上组装,就像这样:gcc -masm=intel stack_frames.asm
.global _main
.text
_main:
push 4 # arg 2
push 5 # arg 1
call plus
mov rdi, rax # exit code = result in rax, which I'm expecting to be 9
mov rax, 0x2000001
syscall
plus:
push rbp
mov rbp, rsp
mov rsi, [rbp + 12] # param 1
mov rdi, [rbp + 8] # param 2
add rdi, rsi # sum in rdi
mov rax, rdi # move sum to rax
mov rsp, rbp
pop rbp
ret发布于 2020-10-14 08:02:24
您使用的是64位的x86-64,而不是32位的x86。您之所以知道这一点,是因为您能够使用像rax这样的64位寄存器。因此,push和call将推送8个字节,而不是4个字节,因此您的参数将是[rbp + 24]和[rbp + 16],而不是[rbp + 12]和[rbp + 8]。
https://stackoverflow.com/questions/64344719
复制相似问题