2.判断语句

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发生了变化

在这里插入图片描述

发现规律:
  1. cmp指令会影响到ZF位
  2. 当ZF位为1时,jne指令跟普通的指令一样,执行完后,会使EIP的地址+2;当ZF位为0时,jne指令会使EIP的地址
    修改为jne指令里的地址,而指令里的地址就是else里面的代码的首地址
得出结论:
  1. if else 的本质其实就是mov, cmp,jne,jmp指令的组合
反复练习,进入潜意识。下面的图形符号代表什么指令呢?

在这里插入图片描述

应用场景

1.当内存里的某个数据要根据不同的去执行不同的指令
2.当内存里的某个数据等于某个特殊值,需要进行额外的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值