编译器为什么生成一组push/pop指令?

7

我使用VC++ 2010编译器编译了下面的代码:

__declspec(dllexport)
unsigned int __cdecl __mm_getcsr(void) { return _mm_getcsr(); }

生成的代码是:

push ECX
    stmxcsr [ESP]
    mov EAX, [ESP]
pop ECX
retn

为什么要使用 push ECX/pop ECX 指令对?
3个回答

12
编译器正在为存储MXCSR在栈上腾出空间。它同样可以这样做:
sub esp,4
stmxcsr [ESP]
mov EAX, [ESP]
add esp,4
retn

但是"push ecx"可能更短或更快。


糟糕...完全错过了。 :) 非常感谢。 - user541686
那怎么解释这个弹出窗口呢? - CodesInChaos
@CodeInChaos - pop 恢复堆栈指针,就像 add esp,4 一样。 - Robᵩ
3
但是使用pop EAX代替mov EAX, [ESP]; pop ECX会更好吗? - CodesInChaos

3
这里的 push 用于分配 4 字节的临时空间。[ESP] 通常指向推送的返回地址,我们不能覆盖它。
然而,ECX 在这里将被覆盖,但是在你所针对的 ABI 中,ECX 可能是一个易失寄存器,因此函数不必保留 ECX。
使用 push/pop 的原因是为了节省空间(可能还有速度)。

0

它创建了一个堆栈顶部的条目,ESP现在将其称为stmxcsr指令的目标。然后结果存储在EAX中以供返回。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接