我编译了这个C代码:

void foo() {
    int i = 0;
    i = 0;
    i = 0;
}

我得到这个:
push ebp
mov ebp,esp
push ecx
mov dword ptr ss:[ebp-4],0
mov dword ptr ss:[ebp-4],0
mov dword ptr ss:[ebp-4],0
mov esp,ebp
pop ebp
retn

我的问题是为什么会有push ecx?为什么堆栈上没有sub esp,4或其他东西来腾出空间?没有使用编译器选项。

最佳答案

无论哪种方式,堆栈上都会有4个字节的可用空间,push会在sub上保存几个字节。也许编译器编写器决定通过推送寄存器来优化这种情况。

关于c - cl.exe产生奇怪的汇编代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8566262/

10-12 05:33