流程控制语句反汇编(1)(Debug版)
// 流程控制语句反汇编
//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版)的更多相关文章
- 在Web应用中接入微信支付的流程之极简清晰版
在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...
- 在Web应用中接入微信支付的流程之极简清晰版 (转)
在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...
- 第一章 python介绍、变量、数据类型、流程控制语句等
一.python介绍 1.python的诞生 python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(龟叔)于1989年发明,第一个公开发行版发行于1991年. ...
- 零基础学Python--------第3章 流程控制语句
第3章 流程控制语句 3.1程序的结构 计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句.选择执行部分语句和循环执行部分语句.程序设计中的3种基本结构为顺序结构.选择结构和循环结构 ...
- Perl流程控制语句
布尔值判断 如果是数字,0表示假,其它所有数字都是真. 如果是字符串,空字符串('')为假,其它所有字符串为真(有例外,见下一条). 如果是字符串'0',perl是当作数值0来处理的,所以这是唯一的非 ...
- 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句
salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...
- [dart学习]第六篇:流程控制语句
经过前面的基础知识了解学习,我们今天可以进入语句模块啦. dart主要有以下流程控制语句: if-else for循环 while和do-while循环 break和continue switch-c ...
- 一篇文章带你了解JavaScript中的语法,数据类型,流程控制语句以及函数
作者 | Jeskson 来源 | 达达前端小酒馆 1 JavaScript有多重要啊,才能让我说说一下,其中的语法,操作符,数据类型,内置功能等. 语法: 在JavaScript中的变量,函数名和操 ...
- 『无为则无心』Python基础 — 13、Python流程控制语句(条件语句)
目录 1.流程控制基本概念 2.选择结构(条件语句) (1)条件语句概念 (2)if语句语法 (3)if...else...语句 (4)多重判断 (5)if语句嵌套 3.应用:猜拳游戏 4.三元运算符 ...
随机推荐
- SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
原文:http://blog.csdn.net/shadowyelling/article/details/7684714 Left Join : 返回左表中的全部信息 以及右表中与左表条件相关的信息 ...
- java 图片上传
代码是最有力量的,嘎嘎 @CrossOrigin@ApiOperation(value = "上传图片", notes = "上传图片", httpMethod ...
- NirSoft 实用程序
64-bit (x64) utilities package 此软件包包含NirSoft中的所有实用程序,这些实用程序具有64位版本(x64)Windows的独立构建. 此程序包包含下面列表中每个实用 ...
- springboot创建bean
springboot创建bean的方式有两种: 1.直接类上加注解@Component@Controller@Service ... 2.使用@Bean注解配合@Configuration注解 区别是 ...
- 使用Python绘制漫步图
代码如下: import matplotlib.pyplot as plt from random import choice class RandomWalk(): def __init__(sel ...
- UVA - 122 Trees on the level (二叉树的层次遍历)
题意:给定结点值和从根结点到该结点的路径,若根到某个叶结点路径上有的结点输入中未给出或给出超过一次,则not complete,否则层次遍历输出所有结点. 分析:先建树,建树的过程中,沿途结点都申请了 ...
- dede开启会员功能
登陆后台,找到菜单里面的系统基本参数设置>会员设置>开启会员功能,选择“是”,保存即可
- Java多线程之Java内存模型
如果要了解Java内存模型,就得对多线程的三大特性有初步的了解. 1.原子性:独一无二.一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.比如i = i+1:其中就包 ...
- Python 中 configparser 配置文件的读写及封装,配置文件存放数据,方便修改
1. 将程序中不常变化的数据放在配置文件中,有什么好处? 将配置统一放在一起,进行统一管理,方便维护,方便修改 配置文件将存放测试数据比如: Excel文件名. 日志名. 用例执行的结果. 实际结果和 ...
- js(JavaScript)使用${pageContext.request.contextPath}报错
前几天写程序在js文件中用到了${pageContext.request.contextPath}然后一直报错,没有办法post到服务器,原来js把这个当成字符串了,一直以为他是jquery的函数! ...