当程序启动时,堆栈是否与4字节边界对齐?

时间:2015-01-11 18:52:31

标签: assembly x86 stack memory-alignment calling-convention

我想确保我的变量正确对齐。所以我有以下问题:

  • 当我的程序首次启动时,即我的入口点开始时 执行,此时堆栈是否与4字节边界对齐? 或者这取决于我是否与CRT联系(我愿意 猜测CRT有自己的入口点,可以调用我的入口点, 所以这个CRT入口点可以调整堆栈对齐,或者是一个 入口点以哪种方式添加到我的程序中?)。或者我不应该做 关于堆栈和检查的对齐的任何假设 esp值我自己?

  • 当我调用一个函数时,这个函数是否需要堆栈 对齐,还是这取决于调用约定?

1 个答案:

答案 0 :(得分:3)

在32位系统上,传递到程序入口点的ESP是4字节对齐的。在64位系统上,它是8字节对齐的。这可以通过程序加载/启动逻辑来保证,它将这样一个对齐的ESP传递给您的入口点。

一旦程序开始执行,所有函数(库,OS调用和您将编码的函数)都希望保留这种对齐,并且几乎没有代码违反它。 (原因之一是:错位堆栈最多意味着访问错位,这会降低程序速度。)