汇编局部变量和参数

Otn*_*cea 2 c assembly

我有以下代码

#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- ..]?

har*_*old 9

我知道局部变量总是[ebp -....]

它们不是(我猜你的问题也证明了这一点).

编译器非常天真地编译是合法的,总是使用帧指针(即使在不执行可变大小的堆栈分配的函数中)并且始终将局部放在堆栈中(这绝对不是规则).在大学的第一年课程中,有时假装这是正常的,以保持简单.

通常不使用帧指针,它的工作方式与使用其中的指针大致相同,只是相对于堆栈指针计算偏移量,现在只允许以可预测的方式移动.因为它必须是可预测的(即,引用堆栈槽的每个指令都可以使用常量偏移量来执行此操作),所以此优化不能用于使用alloca或VGA的函数.在您的示例函数中都没有使用,因此不需要帧指针.

此外,在一般你应该指望局部变量对应于特定的栈槽摆在首位,而不管它们是如何解决的.在变量的整个生命周期内将变量保存在寄存器中是允许的,常见的,并且通常是好事.特别是如果寿命很短或者使用密度非常高.最重要的是,具有不重叠生命周期的变量可以(并且应该,因为它减少了堆栈大小)共享堆栈槽,因为在任何一个时刻它们中至多有一个需要存储(由于假设不重叠的生命时间).

它也允许有从一个堆栈槽的变量跳跃到其他,当你的方式,允许交换得到解决"虚拟"交换两个变量,这可能会发生,仅通过改变它的堆栈槽的变量住,而不是实际上交换数据.