如何计算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:通过汇编栈偏移计算
- 找到汇编中相对于
%rbp的最小偏移量:这里是-72(%rbp),说明栈中最低地址比%rbp低72字节。 - 加上
pushq %rbp指令保存旧%rbp占用的8字节空间。 - 总栈帧大小: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
相关产品推荐
相关产品推荐

