gpt4 book ai didi

assembly - 组装中的 EBP、ESP 和堆栈框架

转载 作者:行者123 更新时间:2023-12-02 11:28:14 24 4
gpt4 key购买 nike

我对以下代码中的 EBP、ESP 和堆栈帧有一些疑问。

  1. 为什么我们要从 esp 中减去 28? main 中有两个局部变量 x 和 y。那么我们为什么不减去 8呢?

  2. 我们不把值从右(或上)到左(或下)堆叠吗?那么为什么我们要在 [eax+8] 上加 1,而不是在 [eax+4] 上呢?

<小时/>
func(int a, int b, int c)
{
return a+b+c;
}
main()
{
int x, y=3;
x=func(y,2,1);
}

Passing Parameters in Assembly

最佳答案

  1. 堆栈指针减去 28,因为两个局部变量需要 8 个字节,func 参数需要 12 个字节。额外的 8 个字节可能是由于编译器尝试将 main 的堆栈与 16 字节边界对齐(堆栈上已经有 4 个字节用于 main 的返回地址,当 EBP 被推送以在 main 的第一条指令中建立堆栈帧时还有另外 4 个字节) )。请参阅-mpreferred-stack-boundary如果您使用的是 GCC。

  2. 参数从右到左传递。由于从堆栈指针减去时已经为三个参数分配了堆栈空间,因此1移动到相对于当前堆栈指针的“最高”位置(+8),2移动到中间(+4) ,并且 y 中的值被移入堆栈指针本身。这与将 1 压入堆栈、将 2 压入堆栈、然后将 y 压入堆栈相同。通过最后一个入栈指令,1 是来自 ESP 的 +8,2 是来自 ESP 的 +4,y 是来自 ESP 的 +0。请注意,在 func 内部,它必须向这些偏移量添加 8,因为返回地址是从调用指令压入堆栈的,并且 func 压入 EBP 来建立堆栈帧。

  3. 对哪种结构感到困惑?

关于assembly - 组装中的 EBP、ESP 和堆栈框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185381/

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