C++代码
bool isWorth{};
if (isWorth == true) {
std::cout << 1;
}
else {
std::cout << 0;
}
汇编代码
mov byte ptr [ebp-5],0
movzx eax,byte ptr [ebp-5]
cmp eax,1
jne 00A1573E
00795725 mov esi,esp
push 1
mov ecx,dword ptr ds:[00A210D4h]
call dword ptr ds:[00A210DCh]
cmp esi,esp
call 00A113C0
EB 17 jmp 00A15755
mov esi,esp
push 0
mov ecx,dword ptr ds:[00A210D4h]
call dword ptr ds:[00A210DCh]
cmp esi,esp
call 00A113C0
机器码
C6 45 FB 00
0F B6 45 FB
83 F8 01
75 19
8B F4
6A 01
8B 0D D4 10 A2 00
FF 15 DC 10 A2 00
3B F4
E8 84 BC FF FF
EB 17
8B F4
6A 00
8B 0D D4 10 A2 00
FF 15 DC 10 A2 00
3B F4
E8 6B BC FF FF
提出问题:
- cpu是通过什么样的机制跳转到00795725这个内存地址的呢?
- if代码末尾为什么会有一条jmp指令?答:为了跳过else代码块里面的代码,避免else代码块被执行。
修改代码
>通过修改单个条件变量isWorth去观察发生的变化:
>发现当isWorth为1时,寄存器EFL不会发生任何的改变
>当isWorth为0时,寄存器EFL发生了变化。
设计实验
当我们运行isWorth为true的程序,执行cmp指令,发现只有TF发生了改变
当我们运行isWorth为false的程序,执行cmp指令,ZF, AF, SF, CF,TF发生了变化
发现规律:
- cmp指令会影响到ZF位
- 当ZF位为1时,jne指令跟普通的指令一样,执行完后,会使EIP的地址+2;当ZF位为0时,jne指令会使EIP的地址
修改为jne指令里的地址,而指令里的地址就是else里面的代码的首地址
得出结论:
- if else 的本质其实就是mov, cmp,jne,jmp指令的组合
反复练习,进入潜意识。下面的图形符号代表什么指令呢?
应用场景
1.当
内存
里的某个数据
要根据不同的值
去执行不同的指令
2.当内存
里的某个数据
等于某个特殊值
,需要进行额外的处理