assembly - 从堆栈指针中减去对齐?

标签 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 如何帮助实现它。

有什么想法吗?

最佳答案

如果在输入函数时堆栈指针与缓存行对齐,则函数的执行可能会减轻缓存的压力。

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

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

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

关于assembly - 从堆栈指针中减去对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10884376/

相关文章:

c++ - PendSV/SVC 异常是否立即引发?

c - 如何要求GCC完全展开此循环(即,剥离此循环)?

c++ - 编译器选择不使用 REP MOVSB 指令进行字节数组移动

Linux x86 Bootstrap

linux - 不执行任何操作的简单 _start 末尾的段错误

assembly - 了解汇编 MIPS .ALIGN 和内存寻址

assembly - 如何在 tasm 中在屏幕上打印 SVGA 信息?

pointers - 汇编中的星号指针 (I32/x86)

assembly - shl 指令抛出 'error A2070 : invalid instruction operands'

string - Nasm equ $-获得错误的长度