gpt4 book ai didi

assembly - 对双变量的数据对齐感到困惑

转载 作者:行者123 更新时间:2023-12-02 21:32:06 24 4
gpt4 key购买 nike

我读到,double 变量(8 字节)必须是 8 字节对齐。

现在,如果我正在为程序编写整个代码,那么我可以使 double 变量按 8 字节对齐,不会出现任何问题。

但假设我有以下场景:我创建一个函数,在堆栈上创建一个 double 变量,然后我将此函数交给其他人在他的程序中使用它。现在,当我的函数被调用时,我的函数将不知道 double 变量是否将在可被 8 整除的地址上创建!

这个问题可以解决吗(请注意,我不关心由于不对齐我的 double 变量而导致的可忽略的性能损失,但我只是想知道是否有解决这个问题的方法) ?

最佳答案

在函数内部,您可以通过将 esp 的三个最低有效位设置为零来强制堆栈为 8 字节对齐。这可以通过 and 指令来实现:

andl $0xfffffff8, %esp

生成的 esp 将等于(即:esp 已对齐)或低于前一个。由于 x86 架构上的堆栈向下增长,这会导致在堆栈上分配大小在 0-7 字节之间的填充

请注意,如果 esp 在执行 and 指令之前已经是 8 字节对齐(即:它的三个最低有效位已经为零),则根本不需要填充(即:在堆栈上创建 0 字节 的填充。

<小时/>

如果使用常用函数prologueepilogue,退出函数时,将恢复之前保存的esp值:

myFunction:
//prologue: save the current stack frame
pushl %ebp
movl %esp, %ebp

andl $0xfffffff8, %esp
//stack now 8-byte aligned
//...

leave //restore the previous stack frame
ret

这样,之前分配的填充现在将从堆栈中释放。

关于assembly - 对双变量的数据对齐感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811549/

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