64位系统下x86_64 call指令的理解疑问
x86_64架构中call指令与栈布局的理解困惑
测试用C代码:
int func(int i) { return i + 1; } int main(void) { int i = 5; i = func(i); return 0; }
对应的汇编代码:
func: push rbp mov rbp, rsp mov DWORD PTR [rbp-4], edi mov eax, DWORD PTR [rbp-4] add eax, 1 pop rbp ret main: push rbp mov rbp, rsp sub rsp, 16 mov DWORD PTR [rbp-4], 5 mov eax, DWORD PTR [rbp-4] mov edi, eax call func mov DWORD PTR [rbp-4], eax mov eax, 0 leave ret
我用Godbolt分析这段C程序的反汇编代码时,对x86_64架构的call指令存在理解困惑。
我知道call指令执行时会把64位(8字节)的返回地址压入栈中,但看func的汇编代码,mov DWORD PTR [rbp-4], edi这一行让我疑惑——按我的预期,返回地址占8字节,那么函数参数应该存在rbp-8的位置,而不是rbp-4,显然我对栈布局的理解有根本性错误,希望得到指导。
内容的提问来源于stack exchange,提问作者BatterySoda
相关产品推荐
相关产品推荐

