当前位置:网站首页>2.判断语句
2.判断语句
2022-07-23 02:49:00 【小鸡岛~】
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指令的组合
边栏推荐
猜你喜欢
随机推荐
亿级融资事件占比超30%,超自动化的下一站是何处?丨曼孚科技
数据库安全性和数据的完整性
构建一个CPU模拟器
2022-07-22:以下go语言代码输出什么?A:1;B:1.5;C:编译错误;D:1.49。 package main import “fmt“ func main() { var i
kali下安装go环境
Airiot Q & A issue 5 | how to use low code business flow engine?
args参数解析
华泰证劵开户有骗局吗安全吗
中信期货网上开户是否安全,网上开户会被骗吗?
Is it safe for CITIC futures to open an account online and will it be cheated?
拓扑排序 & 关键路径
Baidu map eagle eye track service
电脑一直按键如何处理
hdu-7141 Ball (bitset)
华泰证券自己能开户吗安全吗?多久能开完
在Unity中使用Tessellation
想放弃软件测试了,4年经验去面试10分钟结束,测试现在这么难了?
数据库范式与模式分解
Spark 内存管理机制 新版
141.环形链表








