比“ add esp,4”小的指令

Dav*_*idH 5 optimization x86 assembly

又是我。

我的程序中有很多“ add esp,4”,并且试图减小它的大小。有没有更小的指令可以代替“ add esp,4”?

jsp*_*cal 5

pop edx  
Run Code Online (Sandbox Code Playgroud)

或者您不介意销毁的任何其他整数寄存器。

这是现代编译器实际执行的操作(clang,有时甚至是gcc),因为它通常对于性能以及现代CPU上的代码大小都是最佳的。

add esp,4后一call会迫使CPU的堆栈发动机进行实际前将一叠同步UOP add。如果您除了在下一次push / pop / call / ret前使用堆栈指令(例如,作为寻址模式的一部分)之外,不直接使用ESP进行修改,则可以使用来保存uop pop

如果最近执行了其他任何堆栈指令,则堆栈存储器的高速缓存行将在高速缓存中变得很热(使负载便宜)。

  • @DavidH:x86系列中没有这样的指令。这种非正交结构的副作用是假定每个指令都有特定的用途。不能使用DEC处理器或带有`CMP(SP)+,(SP)+`的68K之类的花哨技巧来仅通过较小的副作用(设置条件代码)弹出两个值,因为x86堆栈指针不是通用用法寄存器。 (3认同)

Ste*_*non 5

一个更好的问题可能是:“为什么您有那么多add esp, 4指令,而又怎么做却少了它们呢?” 像这样对堆栈指针进行许多小的增量有点不寻常。

您是否正在同时将事物移入/移出堆叠?您可以使用push/ pop代替吗?

或者,您是否真的需要如此频繁地更新堆栈指针,还是可以避免在代码块的开头移动一次指针以在堆栈上留出一些空间,然后在例程结束时对其进行一次恢复呢?

您到底想做什么?

  • 外部函数调用本身不需要对堆栈指针进行许多小的调整。您是否正在调整堆栈指针以满足ABI对齐要求?作为调用后从堆栈弹出参数的一部分? (2认同)