Dav*_*idH 5 optimization x86 assembly
又是我。
我的程序中有很多“ add esp,4”,并且试图减小它的大小。有没有更小的指令可以代替“ add esp,4”?
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
。
如果最近执行了其他任何堆栈指令,则堆栈存储器的高速缓存行将在高速缓存中变得很热(使负载便宜)。
一个更好的问题可能是:“为什么您有那么多add esp, 4
指令,而又怎么做却少了它们呢?” 像这样对堆栈指针进行许多小的增量有点不寻常。
您是否正在同时将事物移入/移出堆叠?您可以使用push
/ pop
代替吗?
或者,您是否真的需要如此频繁地更新堆栈指针,还是可以避免在代码块的开头移动一次指针以在堆栈上留出一些空间,然后在例程结束时对其进行一次恢复呢?
您到底想做什么?