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. 80行Python代码搞定全国区划代码

    微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...

  2. 概率分析方法与推断统计(来自我写的python书)

    在数据分析统计的场景里,常用的方法除了描述性统计方法外,还有推断统计方法,如果再从工作性质上来划分,推断统计包含了参数估计和假设验证这两方面的内容.而推断统计用到了很多概率统计方法,所以本小节在介绍推 ...

  3. vue watcher errors

    vue watcher errors Error in callback for watcher TypeError: Cannot set property of undefined" n ...

  4. 如何使用 js 实现相似图片搜索

    如何使用 js 实现相似图片搜索 以图搜图 https://www.google.com/imghp?hl=en https://www.google.com/imghp?hl=zh https:// ...

  5. ADN vs CDN All In One

    ADN vs CDN All In One Netlify & JAMstack https://app.netlify.com/teams/xgqfrms/sites ADN Applica ...

  6. CORS All In One

    CORS All In One 跨域资源共享 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS CORS 请求类型 简单请求 预检请求 Ac ...

  7. how to read the system information by using the node cli tool?

    how to read the system information by using the node cli tool? node cli & get system info demos ...

  8. MDN & JavaScript 文档翻译状态

    MDN & JavaScript 文档翻译状态 https://developer.mozilla.org/zh-CN/docs/MDN/Doc_status/JavaScript refs ...

  9. 18_MySQL之HAVING字句的使用

    本节涉及的sql语句: -- HAVING -- 错误示例 SELECT deptno FROM t_emp WHERE AVG(sal)>=2000 GROUP BY deptno; 因为wh ...

  10. 为什么Linux默认页大小是4KB

    本文转载自为什么 Linux 默认页大小是 4KB 导语 我们都知道 Linux 会以页为单位管理内存,无论是将磁盘中的数据加载到内存中,还是将内存中的数据写回磁盘,操作系统都会以页面为单位进行操作, ...