堆栈上的本地存储

时间:2018-10-28 08:57:00

标签: c assembly stack local-storage

我了解到,在堆栈上有一些本地存储的常见情况

情况1 :没有足够的寄存器来保存所有本地数据

情况2 :地址运算符'&'应用于局部变量,因此我们必须能够为其生成地址

情况3 :某些局部变量是结构数组,因此必须通过数组或结构引用进行访问。

在练习题中有一些代码

long call_proc()
{
 long x1=1; int x2= 2;
 short x3=3; char x4=4;
 proc(x1,&x1,x2,&x2,x3,&x3,x4,&x4);
 return (x1+x2)*(x3-x4);
}

<generated assembly code>

call_proc:
subq $32, %rsp
movq $1, 24(%rsp)
movl $2, 20(%rsp)
movw $3, 18(%rsp)
movb $4, 17(%rsp)
leaq 17(%rsp), %rax
movq %rax, 8(%rsp)
movl $4, (%rsp)
leaq 18(%rsp), %r9
movl $3, %r8d
leaq 20(%rsp), %rcx
movl $2, %edx
leaq 24(%rsp), %rsi
movl $1, %edi
call proc
.....

Q1。在这种实践中,是否根据这种情况应用case2而不是case1?

Q2。如果是正确的case2,能否获得一些有关case1的示例?

Q3。通过假设该代码,我认为没有必要将所有局部变量都保存在x1,x2,x3,x4之类的堆栈中。假设合理吗?

1 个答案:

答案 0 :(得分:1)

Q1。是的,显示的示例是案例2。

Q2。要创建案例1的示例,只需创建一个包含6个以上局部变量的函数(对于x86-64;对于其他体系结构,则需要一个不同的数字),其中这些变量的值需要在另一个函数调用之间保留。

这是我写的一个简单示例:https://godbolt.org/z/S8m0lG。在此示例中,变量n是编译器选择放入堆栈的变量,因为没有可用的寄存器来存储它。请注意,即使这是一个简单的示例,我也要确保为所有变量提供不同的值,以便编译器不会将它们组合在一起。