gpt4 book ai didi

c - 与过程调用和汇编语言有关

转载 作者:行者123 更新时间:2023-12-04 05:38:19 26 4
gpt4 key购买 nike

当我遇到这个时,我正在研究 C 的一些概念:

int add (int a, int b)
{
return a+b;
}

int main()
{
int a,b;
a = 3;
b = 4;
int ret = add(a,b);
printf("Result: %u\n", ret);
exit(0);
}

为它生成的汇编代码如下:
<main>:

1: push ebp

2: mov ebp, esp

3: sub esp, 0x18

4: mov eax, 0x0

.........(更多代码但与问题无关)

我想问的问题是为什么在第三步堆栈指针(esp)的值减少了24(0x18)。

最佳答案

它为堆栈上的六个 4 字节整数腾出了空间。这些的确切用法取决于编译器和体系结构,但这些肯定包括 a 各一个。 , b , 和 ret .

顺便说一句,当我在带有 gcc 4.2.1 的 MacBook Pro(x86,64 位,SnowLeopard)上尝试此代码时,它为 8 个 4 字节整数腾出了空间。除上述之外,这些还包括用于存储 eax 的值的一个。在调用 add() 之前和 printf() ,因为每个的结果都在其中返回(显然是由于“cdecl”调用约定)。我机器上的布局如下所示:

-32:  unused
-28: unused
-24: unused
-20: stores eax prior to each function call
-16: ret
-12: b
-8: a
-4: unused (potentially return value for main())
----------------
0: original base pointer

我的猜测是 -4 处的第一个未使用插槽用于 main() 的潜在返回值.我通过替换 exit() 稍微证实了这一点与 return -1; .在这种情况下,它在堆栈上的 -4 和 -8 处为返回值的副本分配了两个整数。 (这似乎是我的编译器的方式,因为 add() 也复制了返回值。)

对于其他 3 个未使用的插槽,我的猜测是我的编译器试图在 8 字节边界上对齐(至少)。这并不能解释为什么它在堆栈顶部添加了另外 8 个字节(两个未使用的整数)。 (我不太确定那里发生了什么——也许它更喜欢在 16 字节边界上对齐?)

您的编译器可能会以不同的方式对齐(并且可能还使用其他一些调用约定和/或优化)。

关于c - 与过程调用和汇编语言有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11624775/

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