我看到这个问题,但在其中没有找到我的答案。
那么,为什么我更喜欢使用add esp, 4
或add esp, 8
而不是使用pop
一次或两次?是否完全没有差别(性能、安全等),还是只是个人选择的问题?
我看到这个问题,但在其中没有找到我的答案。
那么,为什么我更喜欢使用add esp, 4
或add esp, 8
而不是使用pop
一次或两次?是否完全没有差别(性能、安全等),还是只是个人选择的问题?
pop
指令也会执行add esp, 4
操作,它只是在操作之前将栈顶的内容保存到它的操作数中。如果你需要栈上的内容,pop
指令可能比使用mov wherever, [esp]; add esp, 4
指令更快,但如果你只需要清空栈,add esp, 4
指令就足够了。
pop
指令不等同于add esp, N
指令。 pop
用于从堆栈中移除数据并将其存储在某个寄存器中;它也不关心堆栈增长的方向,尽管通常这不是一个问题。手动添加或减去堆栈指针esp
无法保存已经移除的数据到寄存器中。假设您不需要对从堆栈中移除的数据进行任何操作,这样做可能更有效率。pop
从内存(由ss:[esp]指向的堆栈)加载数据到通用寄存器、内存位置或段寄存器。无论如何,pop
使用处理器的load单元访问堆栈,而add esp
不使用load单元。自Pentium Pro以来,处理器具有乱序执行功能Out-of-order execution,即如果这些指令可以同时执行,则在一个周期内执行尽可能多的指令,并且必要时重新排列指令顺序以充分利用单元。
由于大多数处理器只有两个load单元,如果您不需要来自堆栈的数据(即您只想跳过数据),最好使用add esp
,因为它是一个仅寄存器操作,不使用load单元,因此您的处理器将能够在那个时间使用load单元进行其他操作。
pop
操作。如果没有,请使用add esp
。 - Paul Rpop
到一个无用寄存器中可能更有效率,因为负载端口通常不会饱和,并且对于add
操作可能需要一个堆栈同步uop。请参见我在链接问题上的答案。 - Peter Cordes