// 流程控制语句反汇编
//Author:乾卦 Date:2014-5-8 #include<stdio.h>
int main()
{
int a=,b=;
if(a>b)
{
a=b;
}
a=;
b=; return ;
}
//if语句的反汇编
#include<stdio.h>
int main()
{
000000013F711010 push rdi
000000013F711012 sub rsp,10h
000000013F711016 mov rdi,rsp
000000013F711019 mov ecx,
000000013F71101E mov eax,0CCCCCCCCh
000000013F711023 rep stos dword ptr [rdi]
int a=,b=;
000000013F711025 mov dword ptr [rsp],
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=;
000000013F711044 mov dword ptr [rsp],
b=;
000000013F71104B mov dword ptr [b],0Bh return ;
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=,b=;
if(a>b)
{
a=b;
}
else
{
b=a;
}
a=;
b=; return ;
} //if-else语句的反汇编 #include<stdio.h>
int main()
{
000000013FF31010 push rdi
000000013FF31012 sub rsp,10h
000000013FF31016 mov rdi,rsp
000000013FF31019 mov ecx,
000000013FF3101E mov eax,0CCCCCCCCh
000000013FF31023 rep stos dword ptr [rdi]
int a=,b=;
000000013FF31025 mov dword ptr [rsp],
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=;
000000013FF3104D mov dword ptr [rsp],
b=;
000000013FF31054 mov dword ptr [b],0Bh return ;
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=,b=;
if(a>b)
{
a=b;
}
else if(a==)
{
b=a;
}
else if(b<)
{
b=;
}
else
{
a=a+b;
}
a=;
b=; return ;
}
//if-else if-else
#include<stdio.h>
int main()
{
000000013FAD31E0 push rdi
000000013FAD31E2 sub rsp,10h
000000013FAD31E6 mov rdi,rsp
000000013FAD31E9 mov ecx,
000000013FAD31EE mov eax,0CCCCCCCCh
000000013FAD31F3 rep stos dword ptr [rdi]
int a=,b=;
000000013FAD31F5 mov dword ptr [rsp],
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==)
000000013FAD3216 cmp dword ptr [rsp],
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<)
000000013FAD3225 cmp dword ptr [b],
000000013FAD322A jge main+56h (013FAD3236h)
{
b=;
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=;
000000013FAD3244 mov dword ptr [rsp],
b=;
000000013FAD324B mov dword ptr [b],0Bh return ;
000000013FAD3253 xor eax,eax
}
000000013FAD3255 add rsp,10h
000000013FAD3259 pop rdi
000000013FAD325A ret

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

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

流程控制语句反汇编(1)(Debug版)的更多相关文章

  1. 在Web应用中接入微信支付的流程之极简清晰版

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

  2. 在Web应用中接入微信支付的流程之极简清晰版 (转)

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

  3. 第一章 python介绍、变量、数据类型、流程控制语句等

    一.python介绍 1.python的诞生 python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(龟叔)于1989年发明,第一个公开发行版发行于1991年. ...

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

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

  5. Perl流程控制语句

    布尔值判断 如果是数字,0表示假,其它所有数字都是真. 如果是字符串,空字符串('')为假,其它所有字符串为真(有例外,见下一条). 如果是字符串'0',perl是当作数值0来处理的,所以这是唯一的非 ...

  6. 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

    salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...

  7. [dart学习]第六篇:流程控制语句

    经过前面的基础知识了解学习,我们今天可以进入语句模块啦. dart主要有以下流程控制语句: if-else for循环 while和do-while循环 break和continue switch-c ...

  8. 一篇文章带你了解JavaScript中的语法,数据类型,流程控制语句以及函数

    作者 | Jeskson 来源 | 达达前端小酒馆 1 JavaScript有多重要啊,才能让我说说一下,其中的语法,操作符,数据类型,内置功能等. 语法: 在JavaScript中的变量,函数名和操 ...

  9. 『无为则无心』Python基础 — 13、Python流程控制语句(条件语句)

    目录 1.流程控制基本概念 2.选择结构(条件语句) (1)条件语句概念 (2)if语句语法 (3)if...else...语句 (4)多重判断 (5)if语句嵌套 3.应用:猜拳游戏 4.三元运算符 ...

随机推荐

  1. PHP-WebShell-Bypass-WAF

    PHP-WebShell-Bypass-WAF PHP WebShell 一句话的结构是:输入和执行,这是经典的PHP 一句话代码: <?php eval($_GET['test']); ?&g ...

  2. STM32 MacOS开发

    CLion + STM32CubeMX + STLINK 安装CLion jetbrain官网 汉化补丁 安装homebrew ...略 安装STlink命令工具 $ brew install stl ...

  3. centos7上安装mysql8

    话不多说仍然是更换虚拟机的系列安装. 一.首先下载最先版的mysql.到官网下载https://dev.mysql.com/downloads/file/?id=477146 下载后上传linux到相 ...

  4. 19 02 21 selenium get_attribute的几种用法

    获取元素标签的内容: get_attribute(‘textContent’) 获取元素内的全部HTML: get_attribute('innerHTML') 获取包含选中元素的HTML: get_ ...

  5. Tess4j/Tess4j 多线程调用 过程中报错问题记录 Invalid memory access

    最近使用 Tess4j 做一些 OCR图片文字识别的代码. 然后想当然的将这个 ITesseract ocr_robot = new Tesseract(); 作为了工具类做成了成员变量. 当多线程调 ...

  6. 二十三、JavaScript之html事件

    一.代码如下 二.效果如下 三.点击之后 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" ...

  7. 使用HttpURLConnection方式访问接口

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  8. 面试题(9)之 leetcode-189

    题目描述 解法一: /** * @param {number[]} nums * @param {number} k * @return {void} Do not return anything, ...

  9. zoj 1483 划分类DP

    还是看了little_w大神写的才知道怎么写,看完发现自己题意也理解错了,里面有个neighboring,意思就是你指定任务的时候指定的是原序列中连续的一段 然后就是怎么DP了,新学了个很好的dp模型 ...

  10. Elasticsearch 教程

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...