【问题标题】:Why is the compiler generating a push/pop instruction pair?为什么编译器会生成 push/pop 指令对?
【发布时间】:2012-01-14 15:20:53
【问题描述】:

我用 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指令对?

【问题讨论】:

    标签: c assembly x86 sse


    【解决方案1】:

    编译器正在堆栈上腾出空间来存储 MXCSR。它同样可以做到这一点:

    sub esp,4
    stmxcsr [ESP]
    mov EAX, [ESP]
    add esp,4
    retn
    

    但“push ecx”可能更短或更快。

    【讨论】:

    • D'oh... 完全错过了。 :) 非常感谢。
    • 这又如何解释流行音乐?
    • @CodeInChaos - pop 恢复堆栈指针,就像 add esp,4 一样。
    • 但是pop EAX 会比mov EAX, [ESP]; pop ECX 更好吗?
    【解决方案2】:

    这里的push用来分配4字节的临时空间。 [ESP] 通常会指向推送的返回地址,我们无法覆盖。

    ECX 将在此处被覆盖,但是,ECX 可能是您所针对的 ABI 中的一个易失性寄存器,因此函数不必保留 ECX

    这里使用 push/pop 的原因是空间(可能还有速度)优化。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 2022-12-06
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多