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. Linux 驱动框架---cdev字符设备驱动和misc杂项设备驱动

    字符设备 Linux中设备常见分类是字符设备,块设备.网络设备,其中字符设备也是Linux驱动中最常用的设备类型.因此开发Linux设备驱动肯定是要先学习一下字符设备的抽象的.在内核中使用struct ...

  2. matplotlib 图标显示中文

    matplotlib 显示中文 Method_1: # 添上: plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcPara ...

  3. Docker in Action All In One

    Docker in Action All In One Docker https://www.docker.com/play-with-docker https://hub.docker.com/ $ ...

  4. TypeScript callback Object params

    TypeScript callback Object params 回调函数 对象 参数 const func = (options = {}) => { // do somthing retu ...

  5. how to change sketch language to chinese

    how to change sketch language to Chinese https://www.sketch.com/support/troubleshooting/chinese-loca ...

  6. Flutter中mixin的使用

    页表页面 这是一个普通的展示数据,上拉加载更多数据的列表. 其中有一个类型为List<T>的数据列表listData,有个page数据用于分页,isLoading用来判断是否正在加载数据, ...

  7. 2021 NGK新机遇!---NGK生态所、星空计划双赛道爆发

    2021年数字加密货币行业迎来几大发展机遇:1.比特币为首的数量加密资产正处于另类资产向数字黄金定位的历史性巨大发展机遇中,2.Defi等新项目异军提起,形成丰富的行业生态,将在未来对旧有的金融格局产 ...

  8. BGV再度爆发,流通市值破500万美金!

    BGV似乎以超乎寻常的姿态,开启了爆发的模式.这两天,BGV一路上涨,日内最高涨至548.78美金,24小时成交额达到了98.07万美金,24小时成交量达到1844.93枚BGV,流通市值更是突破了5 ...

  9. 在.NET中使用Apache Kafka(一)

    ​曾经在你的应用程序中使用过异步处理吗?在处理不需要立即执行的任务时,异步代码似乎是不可避免的.Apache Kafka是最常用和最健壮的开源事件流平台之一.许多公司和开发者利用它的强大功能来创建高性 ...

  10. 解决margin-top无效问题

    当两个空的块级元素嵌套时,如果内部的块设置有margin-top属性,而且父元素没有下边解决方法所述的特征,那么内部块的margin-top属性会绑架父元素(即将margin-top传递凌驾给了父元素 ...