You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:31:09