我见过一个汇编代码,它在调用函数之前从堆栈指针中减去,没有任何特殊原因。减去的空格为空,不使用:
sub esp, 8 ; stack align
push dword y
push dword [x]
call foo
add esp, 16
mov [x], eax
代码的作者添加了注释'stack align',但我不知道'stack align'是什么意思,也不知道命令sub esp, 8
如何帮助实现它。
有什么想法吗?
答案 0 :(得分:3)
如果在输入函数时堆栈指针与高速缓存行对齐,则执行这些函数可能会减轻缓存压力。
因此,可以组织编译器系统以确保在高速缓存行上对齐SP的情况下输入函数,并且编译器知道每个调用站点使用了多少堆栈,重新对齐需要多少SP在拨打电话之前。
这可以解释你的例子。我没有看到很多编译器实际上这样做,因为堆栈本身往往会适度增长/缩小,并且总体上不会因为一次又一次地重复使用本地存储而对缓存产生太多需求。
另一个用途是为被调用者分配空间,或者返回一个大于寄存器中的结果的空间。编译器不会写这样的注释,所以有些人可能会这样做。也许他知道自己在做什么;也许他没有。如果被调用的函数不需要这个空间,那么它只是一个浪费的指令。