拆卸程序后,我看到生成了以下asm代码:

.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。 >这是编译器的人工产物(缺少优化),需要进行测试以将寄存器作为操作数吗?

评论

你是在自问自答。是的。

这可能也是从4D5914开始的循环的一部分,第一条指令初始化了循环控制变量。虽然这似乎不太可能,但是由于a)如果cx不为零,则jnz会跳转,并且b)这似乎是IDA的反汇编,如果跳转到该地址,ida会生成loc _...标签。 />
我也看到编译器出于对齐的原因这样做。在特定部分内

#1 楼

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

mov     [ebp+var_4], ecx


是下一个的开始。 )。

评论


如本答案所述,优化将消除您已正确识别为编译器工件的怪异现象。这样的事情对于确定代码是“手写”,编译还是潜在地确定使用哪个编译器来构建特定代码非常有用。

– David Hoelzer
2014年12月11日,2:10