// 流程控制语句反汇编
//Author:乾卦  Date:2014-5-8

#include<stdio.h>
int main()
{int a=1,b=10;if(a>b){a=b;}a=2;b=11;return 0;
}
//if语句的反汇编
#include<stdio.h>
int main()
{
000000013F711010  push        rdi
000000013F711012  sub         rsp,10h
000000013F711016  mov         rdi,rsp
000000013F711019  mov         ecx,4
000000013F71101E  mov         eax,0CCCCCCCCh
000000013F711023  rep stos    dword ptr [rdi]  int a=1,b=10;
000000013F711025  mov         dword ptr [rsp],1
000000013F71102C  mov         dword ptr [b],0Ah  if(a>b)
000000013F711034  mov         eax,dword ptr [b]
000000013F711038  cmp         dword ptr [rsp],eax  //如果a<=b 则跳过语句块
000000013F71103B  jle         main+34h (013F711044h)  {a=b;
000000013F71103D  mov         eax,dword ptr [b]
000000013F711041  mov         dword ptr [rsp],eax  }a=2;
000000013F711044  mov         dword ptr [rsp],2  b=11;
000000013F71104B  mov         dword ptr [b],0Bh  return 0;
000000013F711053  xor         eax,eax
}
000000013F711055  add         rsp,10h
000000013F711059  pop         rdi
000000013F71105A  ret  

if规定是满足条件则执行if语句块。
汇编与其相反,是满足条件则跳转,绕过某些代码块,这一点要注意。

if-else

// 流程控制语句反汇编
//Author:乾卦  Date:2014-5-8
#include<stdio.h>
int main()
{int a=1,b=10;if(a>b){a=b;}else{b=a;}a=2;b=11;return 0;
}//if-else语句的反汇编

#include<stdio.h>
int main()
{
000000013FF31010  push        rdi
000000013FF31012  sub         rsp,10h
000000013FF31016  mov         rdi,rsp
000000013FF31019  mov         ecx,4
000000013FF3101E  mov         eax,0CCCCCCCCh
000000013FF31023  rep stos    dword ptr [rdi]  int a=1,b=10;
000000013FF31025  mov         dword ptr [rsp],1
000000013FF3102C  mov         dword ptr [b],0Ah  if(a>b)
000000013FF31034  mov         eax,dword ptr [b]
000000013FF31038  cmp         dword ptr [rsp],eax  //这是执行else的跳转语句 也是else的执行条件
000000013FF3103B  jle         main+36h (013FF31046h)  {a=b;
000000013FF3103D  mov         eax,dword ptr [b]
000000013FF31041  mov         dword ptr [rsp],eax  }else          //这是执行完if语句块跳转到else后的跳转
000000013FF31044  jmp         main+3Dh (013FF3104Dh)  {b=a;
000000013FF31046  mov         eax,dword ptr [rsp]
000000013FF31049  mov         dword ptr [b],eax  }a=2;
000000013FF3104D  mov         dword ptr [rsp],2  b=11;
000000013FF31054  mov         dword ptr [b],0Bh  return 0;
000000013FF3105C  xor         eax,eax
}
000000013FF3105E  add         rsp,10h
000000013FF31062  pop         rdi
000000013FF31063  ret  

if的反汇编仍然没变,但是else有个jmp。

if-else语句的逻辑:if成功,else就不执行。

汇编的逻辑:if失败,跳转到else。否则执行if语句块,在else之前跳到if-else语句末尾。

两者有且只有一个执行。下面来自:《c++反汇编与逆向分析技术揭秘》作者: 钱松林

if-else if-else:

// 流程控制语句反汇编
//Author:乾卦  Date:2014-5-8

#include<stdio.h>
int main()
{int a=1,b=10;if(a>b){a=b;}else if(a==3){b=a;}else if(b<2){b=30;}else{a=a+b;}a=2;b=11;return 0;
}
//if-else if-else
#include<stdio.h>
int main()
{
000000013FAD31E0  push        rdi
000000013FAD31E2  sub         rsp,10h
000000013FAD31E6  mov         rdi,rsp
000000013FAD31E9  mov         ecx,4
000000013FAD31EE  mov         eax,0CCCCCCCCh
000000013FAD31F3  rep stos    dword ptr [rdi]  int a=1,b=10;
000000013FAD31F5  mov         dword ptr [rsp],1
000000013FAD31FC  mov         dword ptr [b],0Ah  if(a>b)
000000013FAD3204  mov         eax,dword ptr [b]
000000013FAD3208  cmp         dword ptr [rsp],eax  //跳到下一个判断语句
000000013FAD320B  jle         main+36h (013FAD3216h)  {a=b;
000000013FAD320D  mov         eax,dword ptr [b]
000000013FAD3211  mov         dword ptr [rsp],eax
000000013FAD3214  jmp         main+64h (013FAD3244h)  }else if(a==3)
000000013FAD3216  cmp         dword ptr [rsp],3
000000013FAD321A  jne         main+45h (013FAD3225h)  {b=a;
000000013FAD321C  mov         eax,dword ptr [rsp]
000000013FAD321F  mov         dword ptr [b],eax
000000013FAD3223  jmp         main+64h (013FAD3244h)  }else if(b<2)
000000013FAD3225  cmp         dword ptr [b],2
000000013FAD322A  jge         main+56h (013FAD3236h)  {b=30;
000000013FAD322C  mov         dword ptr [b],1Eh  }else
000000013FAD3234  jmp         main+64h (013FAD3244h)  {a=a+b;
000000013FAD3236  mov         eax,dword ptr [b]
000000013FAD323A  mov         ecx,dword ptr [rsp]
000000013FAD323D  add         ecx,eax
000000013FAD323F  mov         eax,ecx
000000013FAD3241  mov         dword ptr [rsp],eax  }a=2;
000000013FAD3244  mov         dword ptr [rsp],2  b=11;
000000013FAD324B  mov         dword ptr [b],0Bh  return 0;
000000013FAD3253  xor         eax,eax
}
000000013FAD3255  add         rsp,10h
000000013FAD3259  pop         rdi
000000013FAD325A  ret  

注:红色是一种跳,蓝色是一种跳。

if与else if都是若条件不满足则跳到下一个判断。最后一个else if则是跳到else语句块。else跟以前一样。

转载于:https://www.cnblogs.com/qiangua/p/3717691.html

流程控制语句反汇编(1)(Debug版)相关推荐

  1. python基础第三章选择结构答案-零基础学Python--------第3章 流程控制语句

    第3章 流程控制语句 3.1程序的结构 计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句.选择执行部分语句和循环执行部分语句.程序设计中的3种基本结构为顺序结构.选择结构和循环结构 ...

  2. C语言编程的Debug版和Release版

    C语言编程的Debug版和Release版 简单的来说:Debug版是调试版,可以调试,让程序员用的.Release版是发行版,是用户用的,不能调试. 专业解释 Debug版: Debug 是&quo ...

  3. JS基础02之流程控制语句

    if-else-if多分支语句 练习案例1 说明:输入学生的成绩并根据成绩给出相应的等级, 等级评定标准: 成绩在90–100(包含)之间,显示 A,成绩在80–90(包含)之间, 显示 B,成绩在7 ...

  4. 零基础学Python--------第3章 流程控制语句

    第3章 流程控制语句 3.1程序的结构 计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句.选择执行部分语句和循环执行部分语句.程序设计中的3种基本结构为顺序结构.选择结构和循环结构 ...

  5. java第一周_从计算机基础到流程控制语句(if_else)

    一.计算机基础 裸机 没有安装任何软件的计算机(无操作系统.无应用软件) 计算机的应用 1.科学计算 科学计算也称数值计算.计算机最开始是为解决科学研究和工程设计中遇到的大量数学问题的数值计算而研制的 ...

  6. 【Python自动化测试8】流程控制语句讲解

    文章目录 一.前言 二.流程控制语句 2.1 if else流程控制语句的作用 2.2 if else条件语句讲解 2.2.1 简单的if语句 2.2.2 if / else语句 2.2.3 if / ...

  7. Go语言基础语法-流程控制语句

    前言 程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句.可以通过控制语句实现更丰富的逻辑以及更强大的功能.几乎所有编程语言都有流程控制语句,功能也都基本相似. 其流程控制方式有 ...

  8. 第3章 流程控制语句

    第3章 流程控制语句 第3章 流程控制语句 3.1程序的结构 计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句.选择执行部分语句和循环执行部分语句.程序设计中的3种基本结构为顺序结 ...

  9. debug版函数初始化入口 0xcc

    在VC++编写的程序编程成Debug版,反汇编代码,函数入口处经常看到如下一段代码: 00EA14E0 55                push        ebp   00EA14E1 8B ...

  10. 【Sql Server】Database-sql语言的流程控制语句

    流程控制语句 If  else语句 If (表.列) {语句|语句块begin,,,end} Else {语句|语句块begin,,,end }   If else 语句嵌套 If Begin If ...

最新文章

  1. mysql为int类型的字段php取出来之后为何变为string类型?
  2. 路过的朋友们,最后一天投票,感谢
  3. dcn和dcnv2 torch
  4. Writing a Tile Engine in JavaFX
  5. anacoda里面安装包显示失败_CAD卸载不干净?安装老是失败?送你官方卸载工具...
  6. java script的图片隐藏,java和javascript中过滤掉img形式的字符串不显示图片的方法...
  7. LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)
  8. Redis 数据结构的实现
  9. php dio获取串口数据,flutter通过dio读取二进制数据,比如通过api接口读取图片
  10. 小程序做一个能够左右滑动切换的多tab页面
  11. threejs 模型隐藏后不显示_教师资格证面试报名后显示“待审核”?不做这一步报名白费!...
  12. 问题TypeError: __init__() takes 1 positional argument but 2 were given解决方案
  13. FFT(快速傅里叶变换):UVAoj 12298 - Super Poker II
  14. 存算一体——后摩尔时代的AI芯片架构
  15. 如何下载国外硕博论文?
  16. 瞎子摸象——shopnc篇
  17. excel组合汇总_Excel汇总20140414
  18. java8 access_Java语言8 连接Access数据库UCanAccess的操作介绍
  19. 算法试题——每日一练
  20. shineblink APDS-9960靠近感应及环境光强度测量

热门文章

  1. 类和对象之Scala程序
  2. 已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具
  3. [JavaScript]面向对象编程
  4. python3 llvmlite源码_CentOS 7 64位环境下安装llvm以及python的llvmlite包
  5. 机械臂拉格朗日动力学怎么用matlab仿真_Matlab 机器人动力学参数辨识仿真(1)单摆的动力学参数辨识...
  6. Mac使用Docker搭建python测试执行环境
  7. [图文教程] 手把手教你安装Android SDK
  8. Json文件转Map(四)之代码
  9. Spring AOP(三)之AfterThrowing增强处理
  10. [渝粤教育] 盐城工学院 大学物理(力学、振动与波动) 参考 资料