Assembly 从堆栈指针中减去以进行对齐?
我见过一个汇编代码,它在调用函数之前从堆栈指针中减去,没有任何特殊原因。减去的空间留空且不使用:Assembly 从堆栈指针中减去以进行对齐?,assembly,x86,nasm,Assembly,X86,Nasm,我见过一个汇编代码,它在调用函数之前从堆栈指针中减去,没有任何特殊原因。减去的空间留空且不使用: 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如何帮助实现它 有什么想法吗?如果在输入函数时堆栈指针与缓存线对
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
如何帮助实现它
有什么想法吗?如果在输入函数时堆栈指针与缓存线对齐,则函数的执行可能会减少对缓存的压力 因此,可以组织一个编译器系统,使其坚持输入函数时,SP在缓存线上对齐,并且编译器知道每个调用站点使用了多少堆栈,在进行调用之前重新对齐SP需要多少时间 这可以解释你的例子。我还没有看到很多编译器真正做到这一点,因为堆栈本身往往会以适度的距离增长/收缩,而且由于反复使用本地存储,总体上不会对缓存提出太多要求
另一个用途是为被调用方分配空间,以便被调用方在其中工作,或返回比寄存器中适合的结果更大的结果。编译器不会写这样的注释,所以可能有人这样做了。也许他知道自己在做什么;也许他没有。如果被调用的函数不需要这个空间,那么这只是一条浪费的指令。请参见答案“SSE要求其内存操作数与16字节边界对齐”。但该程序不使用SSE中介绍的任何指令。那么,以16字节对齐堆栈的动机是什么?除了SSE要求之外还有其他原因吗?即使不使用SSE指令,也最好将代码和数据对齐16字节。内存/缓存逻辑和指令预取都有好处,因为它们可以保证通过一次读取就能满足内存请求。这是有意义的,因为现代英特尔芯片的内存接口是64位宽和双通道(16字节)。