为什么编译器会生成推/弹指令对?

Meh*_*dad 7 c x86 assembly sse

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

__declspec(dllexport)
unsigned int __cdecl __mm_getcsr(void) { return _mm_getcsr(); }
Run Code Online (Sandbox Code Playgroud)

并生成的代码是:

push ECX
    stmxcsr [ESP]
    mov EAX, [ESP]
pop ECX
retn
Run Code Online (Sandbox Code Playgroud)

为什么有push ECX/ pop ECX指令对?

Rob*_*obᵩ 12

编译器在堆栈上腾出空间来存储MXCSR.它可以同样做得很好:

sub esp,4
stmxcsr [ESP]
mov EAX, [ESP]
add esp,4
retn
Run Code Online (Sandbox Code Playgroud)

但"推动ecx"可能更短或更快.

  • 但不会'弹出EAX`而不是'mov EAX,[ESP]; 流行ECX`会更好吗? (3认同)