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

use*_*277 6 x86 assembly

我已经读过一个double变量(8个字节)必须是8个字节对齐.

现在,如果我正在为我的程序编写整个代码,那么我可以使double变量8字节对齐而没有任何问题.

但是说我有以下场景:我创建了一个double在堆栈上创建变量的函数,并且我将此函数提供给其他人在他的程序中使用它.现在当我的函数被调用时,我的函数将不知道是否double将在可被8分割的地址上创建变量!

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

眠りネ*_*ネロク 6

在函数里,你可以强制堆栈是通过设置为零三个8字节对齐至少显著位esp.这可以通过以下and指令来实现:

andl $0xfffffff8, %esp
Run Code Online (Sandbox Code Playgroud)

结果esp将是相等的(即:esp已经对齐)或低于前一个.由于x86架构上的堆栈向下增长,因此会在堆栈上分配大小介于0到7个字节之间的填充.

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


离开该功能时,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
Run Code Online (Sandbox Code Playgroud)

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