汇编 for循环
知识点:
for循环生成代码1
for循环生成代码2
inc指令 一、一般情况下的for循环汇编代码分析
for (int i=;i<=;i++)
{
printf("%d,",i);
}
//00401003 |. 51 PUSH ECX ; sub esp,4;int i;
//00401004 |. C745 FC 01000>MOV DWORD PTR SS:[EBP-4],1 ; i=1;
//0040100B |. EB 09 JMP SHORT for.00401016
//0040100D |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4]
//00401010 |. 83C0 01 |ADD EAX,1
//00401013 |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX ; i++;i=i+1;
//00401016 |> 837D FC 0A CMP DWORD PTR SS:[EBP-4],0A
//0040101A |. 7F 14 |JG SHORT for.00401030 ; i>10 跳出for循环
//0040101C |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4] ; ecx=i
//0040101F |. 51 |PUSH ECX ; /<%d>
//00401020 |. 68 F4204000 |PUSH for.004020F4 ; |format = "%d,"
//00401025 |. FF15 A0204000 |CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf
//0040102B |. 83C4 08 |ADD ESP,8 ; esp=esp+8
//0040102E |.^ EB DD \JMP SHORT for.0040100D
//00401030 |> 33C0 XOR EAX,EAX ; return 0; 二、速度优化下的for循环汇编代码分析 //最小化优化
//00401000 /$ 56 PUSH ESI
//00401001 |. 33F6 XOR ESI,ESI ; i=0;
//00401003 |. 46 INC ESI ; i=1;
//00401004 |> 56 /PUSH ESI ; /<%d>
//00401005 |. 68 F4204000 |PUSH for.004020F4 ; |format = "%d,"
//0040100A |. FF15 A0204000 |CALL DWORD PTR DS:[<&MSVCR90.printf>] ; \printf
//00401010 |. 46 |INC ESI ; i++
//00401011 |. 83FE 0A |CMP ESI,0A ; if (i<=10) goto 401004
//00401014 |. 59 |POP ECX
//00401015 |. 59 |POP ECX
//00401016 |.^ 7E EC \JLE SHORT for.00401004
//00401018 |. 33C0 XOR EAX,EAX
//0040101A |. 5E POP ESI
//0040101B \. C3 RETN ; 33-1B //最大化速度优化
//00401000 /$ 56 PUSH ESI
//00401001 |. 57 PUSH EDI
//00401002 |. 8B3D A0204000 MOV EDI,DWORD PTR DS:[<&MSVCR90.printf>] ; MSVCR90.printf
//00401008 |. BE 01000000 MOV ESI,1 ; int i=1;
//0040100D |. 8D49 00 LEA ECX,DWORD PTR DS:[ECX] ; ecx=ecx
//00401010 |> 56 /PUSH ESI
//00401011 |. 68 F4204000 |PUSH for.004020F4 ; ASCII "%d,"
//00401016 |. FFD7 |CALL EDI ; call dword ptr [printf]
//00401018 |. 46 |INC ESI ; i++;
//00401019 |. 83C4 08 |ADD ESP,8
//0040101C |. 83FE 0A |CMP ESI,0A ; 0B
//0040101F |.^ 7E EF \JLE SHORT for.00401010 ; if (i<=10) 继续循环goto 401010
//00401021 |. 5F POP EDI
//00401022 |. 33C0 XOR EAX,EAX
//00401024 |. 5E POP ESI
//00401025 \. C3 RETN
汇编 for循环的更多相关文章
- 控制语句(if-else+循环+switch)汇编规则
[1]说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出) ZF:零标志 SF:符号标志(结果为负数) OF:溢出标志 (补码溢出, 有符号溢出) [2]有两类指令设置条件码而不改变任何其 ...
- 汇编与C语句
---恢复内容开始--- 汇编与C语句 4.1C语句与汇编 学习了汇编语言之后,就需要将常用的C语言代码结构与相应的汇编语言联系起来.这样就可以在分析汇编语言的时候,明白它的意思.C语言中函数过程的调 ...
- Emu8086三种格式的代码-(顺序,分支,循环)
这个学期准备考研,于是就没有怎么听别的课,现在临近期末,汇编成了个难题.下面是我学校的实验报告 做一个复习的记录吧,下面的代码都是在Emu8086上运行出来的代码 下面先介绍一下,汇编里面的格式问题 ...
- JVM执行篇:使用HSDIS插件分析JVM代码执行细节--转
http://www.kuqin.com/java/20111031/314144.html 在<Java虚拟机规范>之中,详细描述了虚拟机指令集中每条指令的执行过程.执行前后对操作数栈. ...
- 【原创】X86下ipipe接管中断/异常
目录 X86 ipipe接管中断/异常 一.回顾 二.X86 linux异常中断处理 1. 中断门及IDT 2. 初始化门描述符 2.1 早期异常处理 2.2 start_kernel中的异常向量初始 ...
- 操作系统实现-boot.asm实现
博客网址:www.shicoder.top 微信:18223081347 欢迎加群聊天 :452380935 这一次我们进入操作系统实现的真实编码, 这一次主要是完善对boot.asm文件的全部实现, ...
- for循环产生的Cortex-M3汇编代码的一个奇怪现象
最近比较一下KEIL和IAR两个编译器产生的代码,基于Cortex-M3处理器的,然后发现了一几个奇怪的地方. 很简单的一个C的for循环 void fun_for_add_65535(void) { ...
- 汇编 do while循环
do while生成的汇编代码 do while汇编还原成C++代码 一. do while成生的汇编代码 // int i=0; // do // { // i++; // } while ( ...
- 汇编语言中loop循环编程
(1)向内存0:200~ 0:23f依次传送数据0~63(3FH) (2)同上简化后的代码,要求九行以内
随机推荐
- 【Redis】Redis学习(七) Redis 持久化之RDB和AOF
Redis 持久化提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF ...
- Net Core通用主机项目报错 程序不包含适合于入口点的静态Main
Net Core通用主机的介绍: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=as ...
- 使用代码段遍历,枚举类型Enum
最近项目中定义了一些枚举类型,需要将枚举的键值传给前端,用于制作下拉菜单. 1.首先定义了枚举类型 public enum 请假类型 : int { 病假 = 1, 事假 = 2, 婚假 = 3, 产 ...
- JBoss 7 里一个EJB依赖其他jar的几种方式
JBoss 7 与之前的版本有了巨大的变化,最核心的类的加载方式变了,有点类似OSGI那样搞起来了分模块的类加载方式,而不是以前的分层类加载.按以前的类加载方式,在加载树底下的那些类,总是能看到父节点 ...
- linux正则表达式(基础正则表达式+扩展正则表达式)
正则表达式应用非常广泛,例如:php,Python,java等,但在linux中最常用的正则表达式的命令就是grep(egrep),sed,awk等,换句话 说linux三剑客要想能工作的更高效,就一 ...
- 看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器
摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置 ...
- TruncateATable 清除一张表
当我们想删除一张表的全部数据时,我们可以使用 truncate 关键字,但如果要删除的表的主键被引用了,那么就无法执行语句. 1.制作清除数据的工具 ,在 nuget 控制台中输入 Install-P ...
- 记一次隐秘的XSS漏洞挖掘
前言 在为某客户网站做渗透测试时发现一个有趣的事情.当我访问该网站的某条链接时服务器返回的是404页面.看到这里我当时就下意识的忽略它,但是后来又想了想这也不是完全没有价值,毕竟中间件及其版本都出来了 ...
- 移动端真机调试抓包,fiddler web debugger
小白一枚,在公司大神指导下加之找了好多资料才勉强将fiddler的使用摸透,果然很好用. 一.设置手机 二.设置fiddler
- October 16th 2017 Week 42nd Monday
The more decisions that you are forced to make alone, the more you are aware of your freedom to choo ...