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

如何计算C语言arith函数的栈帧分配字节数?

计算C语言arith函数的栈帧分配字节数

问题代码

C代码

long arith(long x, long y, long z){
    long t1 = x + y;
    long t2 = z + t1;
    long t3 = x + 4;
    long t4 = y * 48;
    long t5 = t3 + t4;
    long rval = t2 * t5;
    return rval;
}

对应汇编代码

arith:
.LFB0:
        .cfi_startproc
        endbr64
        pushq    %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movq    %rdi, -56(%rbp)
        movq    %rsi, -64(%rbp)
        movq    %rdx, -72(%rbp)
        movq    -56(%rbp), %rdx
        movq    -64(%rbp), %rax
        addq    %rdx, %rax
        movq    %rax, -48(%rbp)
        movq    -72(%rbp), %rdx
        movq    -48(%rbp), %rax
        addq    %rdx, %rax
        movq    %rax, -40(%rbp)
        movq    -56(%rbp), %rax
        addq    $4, %rax
        movq    %rax, -32(%rbp)
        movq    -64(%rbp), %rdx
        movq    %rdx, %rax
        addq    %rax, %rax
        addq    %rdx, %rax
        salq    $4, %rax
        movq    %rax, -24(%rbp)
        movq    -32(%rbp), %rdx
        movq    -24(%rbp), %rax
        addq    %rdx, %rax
        movq    %rax, -16(%rbp)
        movq    -40(%rbp), %rax
        imulq    -16(%rbp), %rax
        movq    %rax, -8(%rbp)
        movq    -8(%rbp), %rax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc

准确计算方法

你之前仅统计局部变量(6个long,6×8=64字节)的方法不正确,因为栈帧包含的内容不止局部变量,正确计算方式有两种:

方法1:通过汇编栈偏移计算

  1. 找到汇编中相对于%rbp的最小偏移量:这里是-72(%rbp),说明栈中最低地址比%rbp低72字节。
  2. 加上pushq %rbp指令保存旧%rbp占用的8字节空间。
  3. 总栈帧大小:72 + 8 = 80字节。

方法2:统计栈上所有存储的数据

栈帧包含三类内容:

  • 函数参数副本:x、y、z被分别存储到-56(%rbp)、-64(%rbp)、-72(%rbp),共3个long,占3×8=24字节。
  • 局部变量:t1、t2、t3、t4、t5、rval被存储到-48(%rbp)至-8(%rbp),共6个long,占6×8=48字节。
  • 保存的基址寄存器:pushq %rbp将旧%rbp压栈,占8字节。
    总计:24 + 48 + 8 = 80字节。

内容的提问来源于stack exchange,提问作者Zayed Aldhaheri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:17:04