当前位置: 首页 > news >正文

do..while、while、for循环反汇编剖析

1、循环语句重要特征提取

循环语句最重要的特点就是执行的过程中会往上跳!!!

箭头往上跳的一般都是循环语句,比如下面的for循环: 

2、do..while语句反汇编

#include<iostream>
using namespace std;
#pragma warning (disable:4996)//1、do..while
void Fun(int x, int y) {do {printf("%d\n", x);x++;} while (x < y);}int main() {Fun(0, 10);system("pause");return 0;
}
00C51790  push        ebp  
00C51791  mov         ebp,esp  
00C51793  sub         esp,0C0h  
00C51799  push        ebx  
00C5179A  push        esi  
00C5179B  push        edi  
00C5179C  mov         edi,ebp  
00C5179E  xor         ecx,ecx  
00C517A0  mov         eax,0CCCCCCCCh  
00C517A5  rep stos    dword ptr es:[edi]  
00C517A7  mov         ecx,offset _A8394B5C_循环语句测试@cpp (0C5C029h)  
00C517AC  call        @__CheckForDebuggerJustMyCode@4 (0C51325h)  
00C517B1  mov         eax,dword ptr [x]  
00C517B4  push        eax  
00C517B5  push        offset string "%d\n" (0C57B30h)  
00C517BA  call        _printf (0C510CDh)  
00C517BF  add         esp,8  
00C517C2  mov         eax,dword ptr [x]  
00C517C5  add         eax,1  
00C517C8  mov         dword ptr [x],eax  
00C517CB  mov         eax,dword ptr [x]  
00C517CE  cmp         eax,dword ptr [y]  
00C517D1  jl          __$EncStackInitStart+15h (0C517B1h)  
00C517D3  pop         edi  
00C517D4  pop         esi  
00C517D5  pop         ebx  
00C517D6  add         esp,0C0h  
00C517DC  cmp         ebp,esp  
00C517DE  call        __RTC_CheckEsp (0C51249h)  
00C517E3  mov         esp,ebp  
00C517E5  pop         ebp  
00C517E6  ret  

由此可以分析:do..while是先执行{}里的内容,然后再判断是不是需要跳出循环,如果不跳出就跳到do..while开始的地方继续执行。

3、while语句分析

#include<iostream>
using namespace std;
#pragma warning (disable:4996)//2、whilevoid Fun(int x, int y) {while (x < y) {printf("%d\n", x);++x;}}int main() {Fun(0, 10);system("pause");return 0;}
009D1790  push        ebp  
009D1791  mov         ebp,esp  
009D1793  sub         esp,0C0h  
009D1799  push        ebx  
009D179A  push        esi  
009D179B  push        edi  
009D179C  mov         edi,ebp  
009D179E  xor         ecx,ecx  
009D17A0  mov         eax,0CCCCCCCCh  
009D17A5  rep stos    dword ptr es:[edi]  
009D17A7  mov         ecx,offset _A8394B5C_循环语句测试@cpp (09DC029h)  
009D17AC  call        @__CheckForDebuggerJustMyCode@4 (09D1325h)
009D17B1  mov         eax,dword ptr [x]  
009D17B4  cmp         eax,dword ptr [y]  
009D17B7  jge         __$EncStackInitStart+39h (09D17D5h)  
009D17B9  mov         eax,dword ptr [x]  
009D17BC  push        eax  
009D17BD  push        offset string "%d\n" (09D7B30h)  
009D17C2  call        _printf (09D10CDh)  
009D17C7  add         esp,8  
009D17CA  mov         eax,dword ptr [x]  
009D17CD  add         eax,1  
009D17D0  mov         dword ptr [x],eax  
009D17D3  jmp         __$EncStackInitStart+15h (09D17B1h)  
009D17D5  pop         edi  
009D17D6  pop         esi  
009D17D7  pop         ebx  
009D17D8  add         esp,0C0h  
009D17DE  cmp         ebp,esp  
009D17E0  call        __RTC_CheckEsp (09D1249h)  
009D17E5  mov         esp,ebp  
009D17E7  pop         ebp  
009D17E8  ret  

while语句是先判断,不符合就跳出循环,符合就执行循环体里的内容,最后再跳到开始进行判断

4、while(y--)语句分析

#include<iostream>
using namespace std;
#pragma warning (disable:4996)void Fun(int x, int y) {while (y--) {printf("%d\n", y);}}
int main() {Fun(0, 10);system("pause");return 0;
}
00FA1790  push        ebp  
00FA1791  mov         ebp,esp  
00FA1793  sub         esp,0C4h  
00FA1799  push        ebx  
00FA179A  push        esi  
00FA179B  push        edi  
00FA179C  lea         edi,[ebp-4]  
00FA179F  mov         ecx,1  
00FA17A4  mov         eax,0CCCCCCCCh  
00FA17A9  rep stos    dword ptr es:[edi]  
00FA17AB  mov         ecx,offset _A8394B5C_循环语句测试@cpp (0FAC029h)  
00FA17B0  call        @__CheckForDebuggerJustMyCode@4 (0FA1325h)  
00FA17B5  mov         eax,dword ptr [y]  
00FA17B8  mov         dword ptr [ebp-0C4h],eax  
00FA17BE  mov         ecx,dword ptr [y]  
00FA17C1  sub         ecx,1  
00FA17C4  mov         dword ptr [y],ecx  
00FA17C7  cmp         dword ptr [ebp-0C4h],0  
00FA17CE  je          __$EncStackInitStart+47h (0FA17E3h)  
00FA17D0  mov         eax,dword ptr [y]  
00FA17D3  push        eax  
00FA17D4  push        offset string "%d\n" (0FA7B30h)  
00FA17D9  call        _printf (0FA10CDh)  
00FA17DE  add         esp,8  
00FA17E1  jmp         __$EncStackInitStart+19h (0FA17B5h)  
00FA17E3  pop         edi  
00FA17E4  pop         esi  
00FA17E5  pop         ebx  
00FA17E6  add         esp,0C4h  
00FA17EC  cmp         ebp,esp  
00FA17EE  call        __RTC_CheckEsp (0FA1249h)  
00FA17F3  mov         esp,ebp  
00FA17F5  pop         ebp  
00FA17F6  ret  

先执行while括号()里的内容,然后cmp判断是否需要跳出循环(当且仅当y==0的时候才会跳出循环!!!我竟然现在才发现😂😂😂),不需要就一路往后执行,然后再跳回到一开始的()的语句进行处理。

5、for循环分析

#include<iostream>
using namespace std;
#pragma warning (disable:4996)void Fun(int x, int y) {for (int i = x; i < y; i++) {printf("%d\n", i);}}int main() {Fun(0, 9);system("pause");return 0;
}
00E61790  push        ebp  
00E61791  mov         ebp,esp  
00E61793  sub         esp,0CCh  
00E61799  push        ebx  
00E6179A  push        esi  
00E6179B  push        edi  
00E6179C  lea         edi,[ebp-0Ch]  
00E6179F  mov         ecx,3  
00E617A4  mov         eax,0CCCCCCCCh  
00E617A9  rep stos    dword ptr es:[edi]  
00E617AB  mov         ecx,offset _A8394B5C_循环语句测试@cpp (0E6C029h)  
00E617B0  call        @__CheckForDebuggerJustMyCode@4 (0E61325h)  
00E617B5  mov         eax,dword ptr [x]  
00E617B8  mov         dword ptr [ebp-8],eax  
00E617BB  jmp         __$EncStackInitStart+2Ah (0E617C6h)  
00E617BD  mov         eax,dword ptr [ebp-8]  
00E617C0  add         eax,1  
00E617C3  mov         dword ptr [ebp-8],eax  
00E617C6  mov         eax,dword ptr [ebp-8]  
00E617C9  cmp         eax,dword ptr [y]  
00E617CC  jge         __$EncStackInitStart+45h (0E617E1h)  
00E617CE  mov         eax,dword ptr [ebp-8]  
00E617D1  push        eax  
00E617D2  push        offset string "%d\n" (0E67B30h)  
00E617D7  call        _printf (0E610CDh)  
00E617DC  add         esp,8  
00E617DF  jmp         __$EncStackInitStart+21h (0E617BDh)  
00E617E1  pop         edi  
00E617E2  pop         esi  
00E617E3  pop         ebx  
00E617E4  add         esp,0CCh  
00E617EA  cmp         ebp,esp  
00E617EC  call        __RTC_CheckEsp (0E61249h)  
00E617F1  mov         esp,ebp  
00E617F3  pop         ebp  
00E617F4  ret  

可以总结:for循环是先给i赋值,然后判断(i<y)是否成立,不成立就跳出循环,成立就执行循环体里面的操作,然后再跳转到上面的i++语句,给i进行增加,接着就继续判断(i<y)是否成立,循环往复,直到不满足i<y为止。

6、i++和++i在for循环当中效率一样吗?

i++:

00E617BD  mov         eax,dword ptr [ebp-8]  
00E617C0  add         eax,1  
00E617C3  mov         dword ptr [ebp-8],eax 

++i:

008B17BE  mov         eax,dword ptr [ebp-8]  
008B17C1  add         eax,1  
008B17C4  mov         dword ptr [ebp-8],eax 

有区别吗?》没区别,所以不要被培训班的老师骗了,编译器才是真理!!!

那么,今天的逆向学习内容到这里就结束了,又是收获满满的一天呢!喜欢的话多多点赞收藏吧!!!🧡🧡🧡🤞

相关文章:

do..while、while、for循环反汇编剖析

1、循环语句重要特征提取 循环语句最重要的特点就是执行的过程中会往上跳&#xff01;&#xff01;&#xff01; 箭头往上跳的一般都是循环语句&#xff0c;比如下面的for循环&#xff1a; 2、do..while语句反汇编 #include<iostream> using namespace std; #pragma …...

【代码随想录】刷题Day53

1.最长公共子序列 1143. 最长公共子序列 和之前的一道题目的区别就是这个子序列不需要每个字符相邻。那么条件就变成两种了&#xff0c;一种是当前的字符相同&#xff0c;一种是不同。相同跟之前的条件一样&#xff1b;不同则需要继承上次比较的较大值。if (text1[i - 1] tex…...

MySQL 索引及查询优化总结

一个简单的对比测试 前面的案例中&#xff0c;c2c_zwdb.t_file_count表只有一个自增id&#xff0c;FFileName字段未加索引的sql执行情况如下&#xff1a; 在上图中&#xff0c;typeall&#xff0c;keynull&#xff0c;rows33777。该sql未使用索引&#xff0c;是一个效率非常低…...

什么是AJAX?

AJAX是一种基于Web的技术&#xff0c;它允许Web应用程序在不刷新整个页面的情况下与服务器进行交互。通过AJAX&#xff0c;Web应用程序可以使用JavaScript向服务器发送异步请求并在不干扰用户的情况下更新页面的部分内容。 AJAX是Asynchronous JavaScript and XML的缩写。尽管…...

报表生成器FastReport .Net用户指南:显示数据列、HTML标签

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…...

bootstrap-dialog弹框,去掉遮盖层,可移动

1.去掉遮盖层的设置data-backdrop"false" <div class"modal fade" id"modal" aria-modal"true" role"dialog" data-backdrop"false" style"width:50%"><div class"modal-dialog modal-l…...

7. user-Agent破解反爬机制

文章目录 1. 为什么要设置反爬机制2. 服务器如何区分浏览器访问和爬虫访问3. 反爬虫机制4. User-Agent是什么5. 如何查询网页的User-Agent6. user-agent信息解析7. 爬虫程序user-agent和浏览器user-agent的区别8. 代码查看爬虫程序的user-agent9. 在代码中加入请求头信息 1. 为…...

3.Nginx+Tomcat负载均衡和动静分离群集

文章目录 NginxTomcat负载均衡和动静分离群集Nginx作用实验七层反向代理nginx动静分离四层反向代理负载均衡 NginxTomcat负载均衡和动静分离群集 Nginx是-款非常优秀的HTTP服务器软件 支持高达50 000个并发连接数的响应拥有强大的静态资源处理能力运行稳定内存、CPU等系统资源…...

数据结构与算法之树结构

目录 为什么要使用树结构树结构基本概念树的种类树的存储与表示常见的一些树的应用场景为什么要使用树结构 线性结构中不论是数组还是链表,他们都存在着诟病;比如查找某个数必须从头开始查,消耗较多的时间。使用树结构,在插入和查找的性能上相对都会比线性结构要好 树结构…...

【python】 用来将对象持久化的 pickle 模块

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了&#xff0c;就是它能够实现任意对象与二进制直接的相互转化&#xff0c;也可以实现对象与文本之间的相互转化。 比如&#xff0c;我程序里有一个 python 对象&#xff0c;我想把它存到磁盘里&#xff…...

【博客654】prometheus配置抓取保护以防止压力过载

prometheus抓取保护配置以防止压力过载 场景 担心您的应用程序指标可能突然激增&#xff0c;以及指标突然激增导致prometheus压力过载 就像生活中的许多事情一样&#xff0c;标签要有节制。当带有用户 ID 或电子邮件地址的标签被添加到指标时&#xff0c;虽然它不太可能结束…...

Backtrader官方中文文档:第十三章Observers观察者

本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 本章包含 backtrader 官方Observers章节全部内容,入口 : https://backtrader.com/docu/observers-and-sta…...

算法leetcode|54. 螺旋矩阵(rust重拳出击)

文章目录 54. 螺旋矩阵&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a;每次循环移动一步&#xff1a;每次循环完成一个顺时针&#xff1a…...

单容水箱建模(自衡单容水箱+无自衡单容水箱)

自衡单容水箱Simulink建模和PLC源代码请参看下面文章链接: 单容双容水箱建模(simulink仿真+PLC代码)_RXXW_Dor的博客-CSDN博客PLC通过伯努利方程近似计算水箱流量详细内容请参看下面的文章博客PLC通过伯努利方程近似计算水箱流量(FC)_怎么用伯努利方程求某水位流量_RXXW_Dor的…...

分享Python7个爬虫小案例(附源码)

本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点&#xff0c;非常适合刚入门python爬虫的小伙伴参考学习。注&#xff1a;若涉及到版权或隐私问题&#xff0c;请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…...

我用ChatGPT写2023高考语文作文(一):全国甲卷

2023年 全国甲卷 适用地区&#xff1a;广西、贵州、四川、西藏 人们因技术发展得以更好地掌控时间&#xff0c;但也有人因此成了时间的仆人。 这句话引发了你怎样的联想与思考&#xff1f;请写一篇文章。 要求&#xff1a;选准角度&#xff0c;确定立意&#xff0c;明确文体&am…...

c++ modbusTCP

//Modbus TCP是一种基于TCP/IP协议的Modbus协议&#xff0c;它允许Modbus协议通过以太网进行通信。 //在C中&#xff0c;可以使用第三方库来实现Modbus TCP通信&#xff0c;例如libmodbus和QModbus。 //使用libmodbus库实现Modbus TCP通信的示例代码如下&#xff1a; //c #incl…...

linux(信号结尾)

目录&#xff1a; 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…...

【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞

node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽&#xff0c;有些二五仔习惯搞点自研的安全扫描工具&#xff0c;然后加点DIY元素&#xff0c;他也不管扫的准不准&#xff0c;就要给你报个高中危的漏洞&#xff0c;然后就要去修复&…...

在linux 上安装 NFS服务器软件

在 Ubuntu Linux 中创建 NFS 文件系统通常需要完成以下步骤: 安装 NFS 服务器软件。您可以在终端上使用以下命令来安装所需的软件包。sudo apt-get update sudo apt-get install nfs-kernel-server创建要共享的目录。例如,您可以创建一个名为 /var/nfs/shared 的目录。sudo m…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...