Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从堆栈指针中减去以进行对齐?_Assembly_X86_Nasm - Fatal编程技术网

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字节)。