这是执行一些算术的代码。
int main(void) {
int i = 3;
i++;
i+= 2;
return 0;
}
我使用 32 位tcc
和以下命令编译它
tcc -o hello.exe hello.c
然后,我使用IDA 免费版对其进行了反汇编,在盯着start
说明看了一段时间后,我意识到我正在寻找的主要功能是在一个子程序中,去那里我看到了这个:
sub_401000 proc near
var_4= dword ptr -4
push ebp
mov ebp, esp
sub esp, 4 // allocate 4 bytes on the stack for var i
nop
mov eax, 3 // i = 3 instructions
mov [ebp+var_4], eax //
mov eax, [ebp+var_4] // i++ instructions
mov ecx, eax //
inc eax //
mov [ebp+var_4], eax //
mov eax, [ebp+var_4] // i+=2 instructions
add eax, 2 //
mov [ebp+var_4], eax //
mov eax, 0
jmp $+5
leave
retn
sub_401000 endp
我已经在我感兴趣的方法主体右侧的评论中添加了我对正在发生的事情的理解。
例如,增加变量将涉及将一个值移动到一个寄存器上,然后对其进行操作。我希望i++
看起来像
mov eax, [ebp+var_4]
inc eax
但实际指令涉及一个额外的动作
mov eax, [ebp+var_4]
mov ecx, eax // <----- ?
inc eax
在添加指令中,没有额外的移动。当我使用递减操作修改代码时,我也看到了额外的移动。
从eax
to移动有什么目的ecx
吗?
更新:
我仍在阅读有关寄存器的内容,并且从我读过的ecx
内容来看,它被用作计数器,但是从这段代码中,它的用途并不明显,如果有的话。