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

时间:2017-08-22 07:34:47

标签: assembly x86

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

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

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

是否可以解决这个问题(请注意,我并不关心因未调整double变量导致的性能损失可忽略不计,但我只是想知道是否有解决此问题的方法?)

1 个答案:

答案 0 :(得分:6)

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

andl $0xfffffff8, %esp

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

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

离开该功能时,如果您使用常用功能序言结语,将恢复之前保存的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 值:

public class SomeMsgAttribute : FilterAttribute, IResultFilter
{
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
        }

        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.Controller.ViewBag.Department= "Department";
        }
}

这样以前分配的填充现在将从堆栈中释放出来。