1、debug

  • if:
10:     if (argc == 0)
0010711E 83 7D 08 00 cmp dword ptr [argc],0
00107122 75 11 jne If+35h (0107135h) //不相等则跳转(为保持代码顺序,if的比较条件在汇编中相反)
11: {
12: printf("%d \r\n", argc);
00107124 8B 45 08 mov eax,dword ptr [argc]
···printf00107132 83 C4 08 add esp,8
13: }
14: if (argc > 0)
00107135 83 7D 08 00 cmp dword ptr [argc],0
00107139 7E 0D jle If+48h (0107148h)
15: {
16: printf("argc >= 0");
···printf00107145 83 C4 04 add esp,4
17: }

总结:debug下,简单的if语句结构为:

cmp

jxx  {if 外语句}

{if 块内语句}

  • if···else···
   35:     if (argc == 0)
0010719E 83 7D 08 00 cmp dword ptr [argc],0
001071A2 75 09 jne IfElse+2Dh (01071ADh)
36: {
37: argc = 5;
001071A4 C7 45 08 05 00 00 00 mov dword ptr [argc],5
38: }
39: else
001071AB EB 07 jmp IfElse+34h (01071B4h) //if块内语句执行结束后,jmp到if-else结束
40: {
41: argc = 6;
001071AD C7 45 08 06 00 00 00 mov dword ptr [argc],6
42: }
  • if···else if···else
50:     if (argc > 0)
00107215 83 7D 08 00 cmp dword ptr [argc],0
00107219 7E 0F jle IfElseIf+3Ah (010722Ah) //if
51: {
52: printf("argc > 0");
···printf
00107228 EB 22 jmp IfElseIf+5Ch (010724Ch) //if块内结束时jmp出条件结构
53: }
54: else if (argc == 0)
0010722A 83 7D 08 00 cmp dword ptr [argc],0
0010722E 75 0F jne IfElseIf+4Fh (010723Fh) //else if
55: {
56: printf("argc == 0");
···printf
57: }
58: else
0010723D EB 0D jmp IfElseIf+5Ch (010724Ch) //else if块内结束后jmp出条件结构
59: {
60: printf("argc <= 0");
···printf

2、release

  • if
void If(int argc)
{
if (argc == 0)
{
printf("%d \r\n", argc);
}
if (argc > 0)
{
printf("argc >= 0");
} return;
}
00351085  | 85C0            | test eax,eax                      | if_else.cpp:73
00351087 | 75 12 | jne if_else.35109B |
···printf |
00351097 | 33C0 | xor eax,eax | if_else.cpp:77
00351099 | 5D | pop ebp |
0035109A | C3 | ret |
0035109B | 7E 0D | jle if_else.3510AA | 优化了一条判断语句
···printf |
003510AA | 33C0 | xor eax,eax | if_else.cpp:77
  • if···else
void IfElse(int argc)
{
if (argc == 0)
{
argc = 5;
}
else
{
argc = 6;
}
printf("%d \r\n", argc);
}
01381081  | 3945 08         | cmp dword ptr ss:[ebp+0x8],eax    |//类似条件表达式中的优化,
01381084 | 0F95C0 | setne al |
01381087 | 83C0 05 | add eax,0x5 |
···
printf
···
01381098 | 33C0 | xor eax,eax | if_else.cpp:76
0138109A | 5D | pop ebp | if_else.cpp:77
0138109B | C3 | ret |
  • if···else if···else
void IfElseIf(int argc)
{
//argc = 0;
if (argc > 0)
{
printf("argc > 0");
}
else if (argc == 0)
{
printf("argc == 0");
}
else
{
printf("argc <= 0");
}
}
002910A5  | 85C9            | test ecx,ecx             | if_else.cpp:75
002910A7 | 7E 12 | jle if_else.2910BB |
002910A9 | B8 A4012D00 | mov eax,if_else.2D01A4 | 2D01A4:"argc > 0"
···printf |
002910B7 | 33C0 | xor eax,eax |
002910B9 | 5D | pop ebp | if_else.cpp:77
002910BA | C3 | ret |
002910BB | 85C9 | test ecx,ecx | if_else.cpp:75
002910BD | BA BC012D00 | mov edx,if_else.2D01BC | 2D01BC:"argc <= 0"
002910C2 | B8 B0012D00 | mov eax,if_else.2D01B0 | 2D01B0:"argc == 0"
002910C7 | 0F45C2 | cmovne eax,edx |//将两条判断优化在一起
···printf

c++ 反汇编 if的更多相关文章

  1. linux内核学习之一 简单c语言反汇编

    (我是第一次发技术博客的菜鸟,恳请大家指导!!) 一  由简单c程序生成汇编代码 首先给出本次我们要反汇编的简单c语言程序:(够简单吧~) 在linux环境中使用下面的命令条件编译: 生成汇编文件sh ...

  2. C/C++ char* arr与char arr[]的区别(反汇编解析)

    写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...

  3. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  4. 通过反汇编理解函数调用机制(x86和ARM)

    如下,一个简单的程序 #include <stdio.h> int add(int a, int b) { return a + b; } void main() { , b = ; in ...

  5. OD 内存映射 属主找不到当前程序名解决办法 和 跟随ClassProc 反汇编窗口空白解决办法

    OD 内存映射 属主找不到当前程序名解决办法 取消 StrongOD 选项里  高级枚举模块选项就OK了  重启OD 跟随ClassProc  反汇编窗口空白解决办法 StrongOD.dll 是有问 ...

  6. 反汇编一个dos软盘的启动扇区

    来源:http://www.ata-atapi.com/hiwdos.htm,自己乱译了一通. Disassembly of a DOS Floppy Boot Sector 反汇编一个dos软盘的启 ...

  7. 如何快速查看将C反汇编的代码

    查看反汇编主要的思路在于将 流程,处理,算法 区分开来.1 函数调用:原C代码: int sum(int, int);int main(){ int c = sum(1, 2); printf(&qu ...

  8. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  10. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. 基础命令使用[win篇]

        基础命令使用 [ win篇 ] 2017-11-05 WIN CMD 0x01 基础命令使用: 演示环境: 1 2 win2008R2cn ip: 192.168.3.23 假设为入侵者机器 ...

  2. 为什么国内的好多具备 HTTPS 的网站却没有使用 HTTPS 重定向功能

    为什么国内的好多具备 HTTPS 的网站却没有使用 HTTPS 重定向功能 HTTPS 重定向 good demos ️ HTTPS http://www.xgqfrms.xyz/ https://w ...

  3. React Learning Paths

    React Learning Paths React Expert React in Action The assessment may cover: Components Events and Bi ...

  4. Flutter 学习路径

    Flutter 学习路径 docs https://flutter.dev/docs https://flutter.dev/community/china https://flutter-io.cn ...

  5. windows 设置右键菜单

    编辑注册表 在文件 右键菜单中添加 xx.reg: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\vscode] &q ...

  6. SHON WEBB:太怀念过去的人,往往走不远

    太怀念过去的人,最后都怎么样?近日,星盟审批官SHON WEBB先生给出了答案,他认为,如果一个人太怀念过去,怀念过去自己所有的荣耀,而轻视现在的任何工作,那他往往走不远. SHON WEBB先生讲到 ...

  7. DeFi热下的冷思考 NGK以更深层次的方式参与DeFi建设

    独具慧眼,深度挖掘DeFi潜力项目 作为早期DeFi的探索者和推动者,NGK在此轮热潮席卷市场前就已经开始构建自己的DeFi生态,独具慧眼的NGK上线了Baccarat流动性挖矿项目,完成了首个由平台 ...

  8. 两年Java,去字节跳动写Python和Go

    前言 2019年5月,在收到offer邮件的那一刻,我仍然不敢相信自己这一番际遇.经历了七场面试,终于得偿所望,拿到了字节跳动的offer. 做加入大厂的决定并不是巧合.在多年的职业生涯里,我曾多次对 ...

  9. 你真的懂 MP4 格式吗?

    MP4 文件格式又被称为 MPEG-4 Part 14,出自 MPEG-4 标准第 14 部分 .它是一种多媒体格式容器,广泛用于包装视频和音频数据流.海报.字幕和元数据等.(顺便一提,目前流行的视频 ...

  10. idea 如何在新窗口中打开项目

    参考链接:https://blog.csdn.net/dreamfly88/article/details/52240188 以前一直再用eclipse,可以同时打开好几个项目,idea中同样支持打开 ...