.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的其他几行,依此类推。的C语言,而:mov [ebp+var_4], ecx
是下一个的开始。 )。
评论
如本答案所述,优化将消除您已正确识别为编译器工件的怪异现象。这样的事情对于确定代码是“手写”,编译还是潜在地确定使用哪个编译器来构建特定代码非常有用。
– David Hoelzer
2014年12月11日,2:10
评论
你是在自问自答。是的。这可能也是从4D5914开始的循环的一部分,第一条指令初始化了循环控制变量。虽然这似乎不太可能,但是由于a)如果cx不为零,则jnz会跳转,并且b)这似乎是IDA的反汇编,如果跳转到该地址,ida会生成loc _...标签。 />
我也看到编译器出于对齐的原因这样做。在特定部分内