2012-06-04 45 views
2

我看到了一个汇编代码,它在调用一个函数之前从堆栈指针中减去,没有任何特别的原因。减去的空间为空,而不是使用:从堆栈指针减去对齐?

sub esp, 8 ; stack align 
push dword y 
push dword [x] 
call foo 
add esp, 16 
mov [x], eax 

代码的作者添加的注释“叠加对准”,但我不知道什么是“叠对齐”的意思,也没有如何做的命令sub esp, 8帮助实现它。

任何想法?

+0

请参阅http://stackoverflow.com/questions/612443/why-does-the-mac-abi-require-16-byte-stack-alignment-for-x86-32 –

+0

答案是“SSE要求他们的记忆操作数对齐到16字节边界“。但该程序不使用SSE中介绍的任何指令。那么对齐16字节堆栈的动机是什么?除了上证所的要求之外,还有另外一个原因吗? –

+1

即使没有使用SSE指令,16字节对齐您的代码和数据也是一个好主意。内存/高速缓存逻辑和指令预取都有好处,因为它们可以保证内存请求只需单次读取即可满足。这是有道理的,因为现代英特尔芯片的存储器接口是64位宽和双通道(16字节)。 – BitBank

回答

3

如果您的堆栈指针在输入函数时与高速缓存线对齐,则执行这些函数可能会对缓存产生较小的压力。

因此,可以组织一个编译器系统来坚持让函数在高速缓存行中与SP对齐输入,并且编译器知道每个调用位置使用了多少堆栈,在呼叫之前调整SP。

这会解释你的例子。我还没有看到许多编译器实际上这样做,因为堆栈本身往往会以适度的距离增长/缩小,并且总体上不会因为重复使用本地存储而对缓存产生太多需求。

另一个用途是为被调用者分配空间来工作,或者返回大于寄存器内容的结果。编译器不会写这样的评论,所以有些人可能会这样做。也许他知道他在做什么;也许他没有。如果被调用的函数不需要这个空间,那么它只是一个浪费的指令。