gcc如何在调用堆栈上对齐EBP,ESP以及先前ESP和当前EBP之间的区域?

时间:2019-06-05 16:18:05

标签: c gcc x86 callstack abi

我的理解是,为了适应x86扩展,流式SIM扩展(SSE)gcc将堆栈对齐在16个字节的边界上。考虑使用gcc版本4.8.4的ubuntu 16.04(32位x86)。堆栈的哪些部分与16字节边界对齐?

我的总体问题是关于堆栈上的数据对齐以及gcc如何对齐堆栈。我想知道的三个位置是EBP,ESP,以及以前的ESP与新的EBP之间的区域。

从教科书中我知道EBP指向存储前一帧指针的地址。 EBP是否被视为堆栈的底部?在将前一个帧指针推入堆栈之前或之后是否插入了填充?

我也知道ESP指向堆栈的顶部。 ESP是否也必须对齐16字节?是否在堆栈顶部放置了填充以使ESP与16字节边界对齐?

最令人困惑的是,新EBP和先前ESP之间的数据区域如何?这是在调用程序中推送函数参数和返回地址的地方。这些被认为是先前堆栈帧或当前堆栈帧的一部分吗?这部分数据应如何对齐?

对我来说这是一个灰色区域。我已经使用gdb分析了堆栈,但是我不清楚如何对齐堆栈以及为什么以这种方式完成堆栈。我希望SO上的某个人可以对gcc的调用堆栈的设计有所了解。

在教科书中,堆栈的常见描述与实现无关,通常省略了有关调用堆栈的对齐,填充和硬边界的讨论。我有要包含的图片,但对于该网站来说太新了,不能发布图片。

0 个答案:

没有答案