我有以下代码
#include<stdio.h>
int adunare(int a,int b)
{
int c=3;
int d=6;
while(c>10) c++;
if(c>15) return a+b+c+d;
else return a+b+c-d;
}
int main()
{
int w=5;
int y=6;
printf("%d",adunare(w,y));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是在汇编中它将变量w,y放在[esp + 24],[esp + 28].
为什么它把我的变量放在那里?
我知道局部变量总是[ebp -....].
为什么这里不是[ebp- ..]?
我知道局部变量总是[ebp -....]
它们不是(我猜你的问题也证明了这一点).
编译器非常天真地编译是合法的,总是使用帧指针(即使在不执行可变大小的堆栈分配的函数中)并且始终将局部放在堆栈中(这绝对不是规则).在大学的第一年课程中,有时假装这是正常的,以保持简单.
通常不使用帧指针,它的工作方式与使用其中的指针大致相同,只是相对于堆栈指针计算偏移量,现在只允许以可预测的方式移动.因为它必须是可预测的(即,引用堆栈槽的每个指令都可以使用常量偏移量来执行此操作),所以此优化不能用于使用alloca或VGA的函数.在您的示例函数中都没有使用,因此不需要帧指针.
此外,在一般你应该不指望局部变量对应于特定的栈槽摆在首位,而不管它们是如何解决的.在变量的整个生命周期内将变量保存在寄存器中是允许的,常见的,并且通常是好事.特别是如果寿命很短或者使用密度非常高.最重要的是,具有不重叠生命周期的变量可以(并且应该,因为它减少了堆栈大小)共享堆栈槽,因为在任何一个时刻它们中至多有一个需要存储(由于假设不重叠的生命时间).
它也允许有从一个堆栈槽的变量跳跃到其他,当你的方式,允许交换得到解决"虚拟"交换两个变量,这可能会发生,仅通过改变它的堆栈槽的变量住,而不是实际上交换数据.