汇编 for循环

知识点:
?for循环生成代码1
?for循环生成代码2
?inc指令

一、一般情况下的for循环汇编代码分析
     for (int i=1;i<=10;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
时间: 2024-08-25 10:33:39

汇编 for循环的相关文章

学习笔记-汇编-双层循环

汇编中 循环的语法是 C语言中的循环 mov cs,N   //循环最大次数    <-----> int i=N; blockName: //循环开始 <----->  for(;i>0;i++){ //xxx...   //循环中的语句      <-----> //XXXX loop blockName //循环结束  <-----> } 另附上汇编示例代码 1 assume cs:code 2 code segment 3 start: 4 m

汇编指令大全

blt   小于跳转 tst r0,#02 bne sleep ldr  r1,#0 解释:位比较,先进行and运算,如果r0第2位不为1,则与的结果为0,设置标志位zero=1,继续下面的ldr指令.反之,zero=0,跳转到sleep执行. bne指令: 非零则跳转 个人总结:tst 和bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处). tst 和beq连用: 先是用tst进行位与运算,然后将位

ARM汇编指令汇总

1.ARM汇编的格式:    在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写:有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错.常量定义需要顶格书写,不然,编译器同样会报错.    2.字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号.    3.在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同

Emu8086三种格式的代码-(顺序,分支,循环)

这个学期准备考研,于是就没有怎么听别的课,现在临近期末,汇编成了个难题.下面是我学校的实验报告 做一个复习的记录吧,下面的代码都是在Emu8086上运行出来的代码 下面先介绍一下,汇编里面的格式问题 简化段格式定义.MODEL SMALL ;定义程序的存储模式 .MODEL SMALL ;定义程序的存储模式 .STACK ;定义堆栈段 .DATA ;定义数据段 ....... ;数据定义 .CODE ;定义代码段 .STARTUP ;程序起始点,并建立DS,SS内容 ....... ;程序定义

信息安全系统设计基础第四周学习总结

$3.1x86的发展历史 1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全   2 8086的分段模式   3 IA32的带保护模式的平坦模式 $3.2程序编码 1.机器级代码:机器级编译的两种抽象:指令集体系结构和存储地址是虚拟地址.一条指令只执行一个非常基本的操作. 2.关于格式的注解:所有以“.”开头的行都是知道汇编器和链接器的命令 gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数

《30天自制操作系统》第一天

一开始作者搞了一个装满二进制的文件,用binary editor来制作.该软件下载地址http://www.vcraft.jp/soft/bz.html 当然,在我看来,这些二进制没什么意义,因为根本无法阅读. 但作者是想让读者了解cpu其实就是解读二进制指令的. 直接附上第一天的汇编代码: ; hello-os ; TAB=4 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; ブートセクタの

C语言-第33课 - 认清函数的真面目

第33课 - 认清函数的真面目 一.概念 函数的由来 程序 = 数据 + 算法 C程序 = 数据 + 函数 我们下面分析一下汇编语言,汇编语言是从上到下顺序执行的,汇编为了循环执行,就有了跳转指令.通过来回的跳转,就存在了不同的功能模块,这也就是我们C语言中的函数的原型. 函数的意义 模块化程序设计: C语言中的模块化: 面向过程的程序化设计 (1) 面向过程是一种以过程为中心的编程思想. (2) 首先将复杂的问题分解为一个个容易解决的问题. (3) 分解过后的问题可以按照步骤一步步完成. (4

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

汇编学习-分支与循环

在高级语言程序设计中,我们不仅要求程序可以顺序运行,还要求其可以运行不同分支,或者反复运行某些操作.在汇编语言中,相同具有相同的能力,可以由对应的指令来控制程序的运行流程.由于毕竟高级语言都是汇编实现的,仅仅是不直观而已. 转移 无条件转移为JMP.类似c语言中的 goto. 在c语言中,goto是不推荐使用的,会使程序难以控制和理解,但在汇编中,没有对应的if 和 while语句.仅仅能使用 JMP来完毕逻辑复杂的控制结构. JMP分为段内转移和段间转移.只是在windows编程上,一个代码段