3

我见过一个汇编代码,它在调用函数之前从堆栈指针中减去,而没有任何特殊原因。减去的空间留空且未使用:

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

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

有任何想法吗?

4

1 回答 1

3

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

因此,可以组织编译器系统来坚持输入函数时 SP 对齐在缓存行上,并且编译器知道在每个调用站点使用了多少堆栈,在之前重新对齐 SP 需要多少时间它会打电话。

这将解释你的例子。我还没有看到很多编译器实际上这样做,因为堆栈本身往往会以适度的距离增长/缩小,并且由于一次又一次地重用本地存储,总体上不会对缓存提出太多要求。

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

于 2012-06-04T18:24:56.083 回答