为什么会生成这些指令?

逆向工程 拆卸 编译器
2021-07-05 07:22:05

反汇编程序后,我看到生成了以下汇编代码:

.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.

这是编译器的工件(错过的优化),需要测试以将寄存器作为操作数吗?

1个回答

这是至少由 gcc 生成的汇编中的常见模式。当不要求优化生成的代码时,C 和 asm 之间的转换非常简单。C 中的一个语句产生了几行 asm。下一条语句:多几行汇编,依此类推。

在你的情况下:

mov     [ebp+var_4], ecx

可能是一行 C 的结尾,而:

mov     ecx, [ebp+var_4]

是下一个的开始。

一旦提供-O1(或更高),这些指令就会被优化