gpt4 book ai didi

c - assembly 局部变量和参数

转载 作者:行者123 更新时间:2023-12-02 06:14:48 25 4
gpt4 key购买 nike

我有以下代码

#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));
}

我的问题是在汇编中它把变量 w,y 放在 [esp+24] ,[esp+28] 上。

为什么它把我的变量放在那里?

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

为什么这里不是[ebp-..]?

最佳答案

I know that local variables are always [ebp-....]

他们不是(我想你的问题也证明了这一点)。

编译器真的很天真地编译是合法的,总是使用帧指针(即使在不进行可变大小堆栈分配的函数中)并且总是首先将局部变量放在堆栈上(这绝对不是规则)。在大学一年级的类(class)中,为了简单起见,有时会假装这是正常的。

通常可以不使用帧指针,它的工作原理与使用帧指针基本相同,只是偏移量是相对于堆栈指针计算的,现在您只能以可预测的方式移动它。因为它必须是可预测的(也就是说,引用堆栈槽的每条指令都可以使用常量偏移量来实现),所以不能在使用 alloca 或 VLA 的函数中使用此优化。在您的示例函数中,两者都没有使用,因此不需要帧指针。

此外,一般而言,您应该期望局部变量首先对应于特定的堆栈槽,无论它们是如何寻址的。在变量的整个生命周期内将变量保存在寄存器中是允许的、常见的,而且通常是一件好事。尤其是在使用生命周期短或使用密度非常高的情况下。最重要的是,具有非重叠生命周期的变量可以(并且应该,因为它减少了堆栈大小)共享堆栈槽,因为在任何时刻最多有一个变量需要存储(由于生命周期不重叠的假设)。

它也允许变量从一个栈槽跳到另一个,这可能发生在当你以一种允许“虚拟地”解决交换的方式交换两个变量时,只需更改变量所在的栈槽而不是实际交换数据。

关于c - assembly 局部变量和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com