反汇编程序后,我看到生成了以下汇编代码:
.text:004D5911 mov [ebp+var_4], ecx
.text:004D5914 mov ecx, [ebp+var_4]
.text:004D5917 test ecx, ecx
.text:004D5919 jnz short loc_4D591F
我不明白为什么[ebp+var_4]
被复制回ecx
.
这是编译器的工件(错过的优化),需要测试以将寄存器作为操作数吗?
反汇编程序后,我看到生成了以下汇编代码:
.text:004D5911 mov [ebp+var_4], ecx
.text:004D5914 mov ecx, [ebp+var_4]
.text:004D5917 test ecx, ecx
.text:004D5919 jnz short loc_4D591F
我不明白为什么[ebp+var_4]
被复制回ecx
.
这是编译器的工件(错过的优化),需要测试以将寄存器作为操作数吗?
这是至少由 gcc 生成的汇编中的常见模式。当不要求优化生成的代码时,C 和 asm 之间的转换非常简单。C 中的一个语句产生了几行 asm。下一条语句:多几行汇编,依此类推。
在你的情况下:
mov [ebp+var_4], ecx
可能是一行 C 的结尾,而:
mov ecx, [ebp+var_4]
是下一个的开始。
一旦提供-O1
(或更高),这些指令就会被优化。