精华内容
下载资源
问答
  • 如何用汇编写while的循环
    千次阅读
    2019-04-12 17:59:40

    初始化循环变量ecx->跳到条件判断处->如果条件满足则跳到入口(entry),否则继续向下执行(即退出循环)。

    include vcIO.inc
    
    .data
    
    str_ byte "while-repeat",0ah, 0
    .code
    main proc
    
    mov ecx,1
    jmp testLab
    entry:
    ;	
    	pushad
    	invoke printf , offset str_
    	popad	
    ;	
    	inc ecx
    testLab:
    	cmp ecx, 5
    	jbe entry
    
    	invoke _getch
    
    
    ret
    main endp
    end main
    
    更多相关内容
  • 高级语言的while循环如下: while( val1 < val2 ) { val1++; val2 --; } 用汇编语言实现这个结构时,可以很方便地改变循环条件,当条件为真时,跳转到 endwhile。 .data val1 word 2 val2 word 9 ....

    高级语言的while循环如下:

    while( val1 < val2 )
    {
        val1++;
        val2 --;
    }

    用汇编语言实现这个结构时,可以很方便地改变循环条件,当条件为真时,跳转到 endwhile。

    .data
    val1 word 2
    val2 word 9
     
    .code
    main proc
    	nop
    	begin_while:
    	    mov ax, val1
        	cmp ax, val2
    	    jnl end_while
    	    inc word ptr val1
    	    dec word ptr val2
    	    jmp begin_while
    	end_while:
    	invoke ExitProcess, 0
    main endp
    end main
    

    高级语言尤其善于表示嵌套的控制结构。如下 C++ 代码所示,在一个 WHILE 循环中有嵌套 IF 语句。它计算所有大于 sample 值的数组元素之和:

    int array[] = {10,60,20,33,72,89,45,65,72,18};
    int sample  =  50;
    int ArraySize = sizeof array / sizeof sample;
    int index = 0;
    int sum  =  0;
    while( index < ArraySize )
    {
        if( array[index] > sample )
        {
            sum += array[index];
        }
        index++;
    }

    .data
    array sdword 10,60,20,33,72,89,45,-65,-72,18
    sample sdword 50
    sum dword 0
     
    .code
    main proc
    	nop
        mov eax, sum
        mov edx, sample
        mov ecx, lengthof array
        mov esi, 0
        begin_while:
            cmp esi, ecx
            jae end_while
            cmp array[esi*type array], edx
            jng L1
            add eax, array[esi*type array]
            L1: inc esi 
            jmp begin_while
        end_while:
        mov sum, eax
    	invoke ExitProcess, 0
    main endp
    end main
    

    展开全文
  • 汇编 do while循环

    2017-02-06 14:37:00
    do while生成的汇编代码  do while汇编还原成C++代码 一、 do while成生的汇编代码 // int i=0; // do // { // i++; // } while (i<=10); // return 0; //00401003 |. 51 PUSH ECX ...
    do while生成的汇编代码
     do while汇编还原成C++代码
     
    一、 do while成生的汇编代码
     
    //	int i=0;
    //	do 
    //	{
    //		i++;
    //	} while (i<=10);
    //	return 0;
    //00401003  |.  51            PUSH ECX                                 ;  int i;
    //00401004  |.  C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0               ;  i=0;
    //0040100B  |>  8B45 FC       /MOV EAX,DWORD PTR SS:[EBP-4]            ;  eax=i;
    //0040100E  |.  83C0 01       |ADD EAX,1                               ;  eax++
    //00401011  |.  8945 FC       |MOV DWORD PTR SS:[EBP-4],EAX            ;  i++;
    //00401014  |.  837D FC 0A    |CMP DWORD PTR SS:[EBP-4],0A             ;  i<=10
    //00401018  |.^ 7E F1         \JLE SHORT dowhile.0040100B
    
    	//int j=10,i=0;
    	//do 
    	//{
    	//	i++;
    	//	printf("do while \n");
    	//} while (i<j);;
    
    	//printf("for begin\n");
    	//for (i=0;i<=j;i++)
    	//{
    	//	printf("do for");
    	//}
    	二、 do while汇编还原成C++代码
    
        int a=1;
    	do 
    	{
    		a++;
    	} while (a<=10);
    	printf("begin for");
    	int b=1;
    	for (;b<=10;b++)
    	{
    		
    	}
    	printf("end for");
    

     

    知识点:
    
     while循环分析
     while循环与for循环
    
    一、while循环生成的汇编代码
       while(条件)
       {
       }
    二、while循环转换成等价for循环
        int i=0;
    	while(i<20)
    	{
    		i++;
    	}
    
    	printf("for begin");
    与上边的while语句等价
        int j=0;
    	for (;j<20;)
    	{
    		j++;
    	}
    

     

    转载于:https://www.cnblogs.com/whzym111/p/6370249.html

    展开全文
  • 汇编循环语句

    千次阅读 2020-03-04 16:26:49
    今天看了《加密与解密》循环语句部分,接下来将从do-while循环while循环,for循环三个方面去学习循环的汇编。 0x01 do-while循环 do-while循环的流程是:先执行语句块,在进行表达式判断,当表达式为真时,在继续...

    今天看了《加密与解密》循环语句部分,接下来将从do-while循环,while循环,for循环三个方面去学习循环的汇编。

    0x01 do-while循环

    do-while循环的流程是:先执行语句块,在进行表达式判断,当表达式为真时,在继续执行语句块。接下来先看一段C语言代码

     #include "stdafx.h"
    
        int main(int argc, char* argv[])
        {
            int nCount=0;
            do{
                printf("%d\r\n",nCount);
                nCount++;   
            }
                while(nCount<argc);   argc为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1return 0;
        }
    

    切到反汇编模式
    在这里插入图片描述
    可以看到,先执行了输出语句和nCount的自增,然后比较nCount和argc的大小,若小于则循环,否则将线性向下执行。
    下面是我写的汇编代码

    
     #include "stdafx.h"
    
        int main(int argc, char* argv[])
        {
                //int nCount=0;
                char *str="%d\r\n";
                _asm{
                              mov eax,0
            circle:           push eax
                              push str
                             call printf       //调用printf函数
                              add esp,8       //平衡栈
                              inc eax         //nCount自增,         
                            cmp eax,dword ptr [ebp+8]
                           jl circle             //if (nCount<argc),跳转到circle循环执行
                           xor eax,eax     //设置返回值为0
                }
        }
    

    成功运行!
    在IDA Pro里面识别do—while循环
    在这里插入图片描述在这里插入图片描述

    0x02 while循环

    while循环的流程是:先进行表达式判断,在执行语句块,当表达式为真时,会继续执行语句块,示例如下

    #include<stdio.h>
    void main()
    {
          char *str="%d\n";
    _asm{
                      mov eax,1             //i=1
                      mov ebx,0            //sum=0
    circle:           cmp eax,100
                      jg   end
                     add ebx,1              //sum++
                     inc eax,1            //i++
                     jmp circle
    end:
                     push ebx
                     push str
                     call printf
                     add esp,8
    }
    }
    

    切入到反汇编:
    在这里插入图片描述
    可以看到,先比较i与100的大小,若i<=100,则执行语句块,否则就直接输出sum。
    下面是我写的汇编代码

    #include<stdio.h>
    void main()
    {
          char *str="%d\n";
    _asm{
                        mov eax,1             //i=1
                      mov ebx,0            //sum=0
    circle:           cmp eax,100
                      jg   end
                     add ebx,1              //sum++
                      inc eax,1            //i++
                     jmp circle
    end:
                      push ebx
                      push str
                      call printf
                     add esp,8
    }
    }
    

    在IDA Pro里面识别while循环
    在这里插入图片描述在这里插入图片描述
    循环的特点是会向低地址跳转。while循环和do-while循环区别:
    1.while循环使用的是jmp循环,while循环使用的是jxx汇编指令需要取反
    2.while循环比do循环多一次if判断,因此性能上while循环不如do循环高,在Release版本中,编译器会把while循环优化成等价的do循环。

    0x03 for循环

    for语句由赋初值,循环条件,循环步长三条语句组成,示例如下:

      #include "stdafx.h"
    
        int main(int argc, char* argv[])
        {
            for(int nCount=0; nCount<argc;nCount++)
                   {
                                printf("%d\r\n",nCount);
                   }
                        return 0;
        }
    

    切入到反汇编
    在这里插入图片描述
    在这里可以看到,对nCount赋值以后,就跳到判断的位置,如果判断结果为真,就跳上去执行语句块
    接下来是我写的汇编代码

       #include "stdafx.h"
    
        int main(int argc, char* argv[])
        {
              char *str="%d\r\n";
        _asm{
                    mov eax,0   
                             jmp judge
        circle:      add eax,1
        judge:     cmp eax,dword ptr[ebp+8]
                                     jge circle
                              push eax
                              push str
                              call printf
                    add esp,8
                    xor eax,eax
        }
        }
    

    在IDA Pro里面识别for循环
    在这里插入图片描述在这里插入图片描述关于循环语句的学习就先到这里。

    eax加1,可以有如下两种表示:

        inc eax
        add eax,1
    

    复制代码
    虽然功能一样,可还是有以下区别:
    (1) 机器码长度不同,inc短,add长。(这不是关键)
    (2)INC不改变标志位CF,而ADD则改变CF。(这点很关键。)
    例如:

            number dw 0FFFFH,1234H,0,0,0
           表示的80位数1234FFFFH,希望给它加2。
            MOV SI,OFFSET NUMBER
             MOV CX,4              ;4个高位的字单元
            ADD WORD PTR [SI],2   ;最低位加2
    L1:
             INC SI
             ADC WORD PTR [SI],0   ;把产生的进位加到高位
            LOOP L1
    

    若把INC SI换成ADD SI,1就会出错。原因是 ADD WORD PTR [SI],2产生了CF,若用ADD SI,1就会把CF清0,从而后面的ADC就不能把前面的进位加上。

       dec eax
       sub eax,1
    

    复制代码
    eax减1,dec和sub的区别也和加1类似。

    展开全文
  • 汇编语言实现for循环

    千次阅读 2019-04-12 17:46:10
    先跳进条件判断处,根据是否满足条件跳到入口或继续执行 include vcIO.inc .data str_ byte "repeating",10, 0 ;Variable names cannot be called "str" .code main proc ... invoke ...
  • while汇编

    2019-08-27 19:48:23
  • c语言中提供多种循环结构,即do-while while for,汇编中没有响应指令提供这三种循环 但是可以使用条件测试和跳转进行组合起来 以实现上述三种循环效果, 大多数汇编会根据一个循环的do-while来产生代码,但是实际c...
  • while循环(或称while语句),也是条件循环,一般格式为: while(条件表达式) { 循环语句 } 程序运行时,首选判定条件表达式结果是否为true,如果为true,就执行循环语句;反之则跳过,去执行while循环...
  • C语言 #include<stdio.h>... while(i < 11) { sum = sum + i; i = i + 1; } printf("sum: %d", sum); return 0; } MIPS汇编 .text main: li $a0, 1 # i li $a1, 0 # s
  • 关于for、while循环延时时间

    千次阅读 2021-03-14 15:48:39
    注:12M晶振,一周期为1us#includemain(){unsigned ...}上述程序汇编代码:C:0x0007 EF MOV A,R7C:0x0008 1F DEC R7C:0x0009 AC06 MOV R4,0x06C:0x000B 7001 JNZ C:000EC:0x000D 1E DEC R6C:0x000E 4C ORL A,R4C:0x...
  • 除了 CMP 和条件跳转指令外,.REPEAT 和 .WHILE 伪指令还提供了另一种方法来编写循环。它们可以使用之前由《.IF伪指令》一节中关系和逻辑运算符表所列出的条件表达式。.REPEAT 伪指令执行循环体,然后测试 .UNTIL ...
  • arm64汇编篇-11循环while、for

    千次阅读 2018-06-07 12:03:45
    while循环 创建工程-&gt;main函数页面写入以下代码: void func(){ int nSum = 0; int i = 0; while (i &lt;= 100){ nSum = nSum + 1; i++; } } 2.真机编译将得出的mach-O文件放入ida64中解析...
  • 单元二 PHP开发基础 2.6 流程控制结构;do-while语法格式;知识应用举例;常见问题;小结练习;主讲张俊晖
  • 0. 在最前面 本文持续更新地址:https://haoqchen.site/2020/05/08/all-kind-of-loop-1/ 在学习的过程中发现C++有各种各样的循环方式,比如最基本的: for while 后面增加的: std::for_each 基于范围的for循环 ...
  • X =1 .code main PROC cmp al,bl ja L1 cmp bl,cl jbe next L1: mov X,1 next: INVOKE ExitProcess,0 main ENDP END main 9: while语句编写汇编时的情况 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,...
  • 汇编学习教程:循环和CX寄存器

    千次阅读 2022-03-08 21:35:13
    通过do while循环结构进行表达,我们发现是不是更加容易理解Loop指令执行过程了呢! CX寄存器 通过上面对Loop指令执行过程的阐述,我们会发现,CX寄存器的值会影响到Loop指令的执行结果。CX寄存器中的值就相当于...
  • 1.do-while循环 2.while循环 3.for循环 1.do-while循环 do body-statement while (test-expr) ; 效果:重复执行 body-statement, 对七est-expr 求值,如果求值的结果为非零, 则继续循环。可以看到, body-s 七...
  • arm汇编语言使用循环实现数组遍历(正序)
  • 汇编语言中的loop循环

    2022-08-02 17:23:59
    介绍汇编语言中的loop循环
  • c语言学习(循环语句while1)

    千次阅读 2021-11-14 16:48:27
    循环语句(三种) ...如果我们想要用while表示1-10 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int i = 1; while (i <= 10) { printf("%d ", i); i++; }...
  • 问题现象: 在主函数main中,有等待某一状态变量改变的while循环,在调试模式下观测该状态已经发生了改变,但while判断就是过不去,而在单步调试,判断是可以过去的。
  • while 语句的三种控制/结束循环方式

    千次阅读 2021-05-20 09:39:55
    但有时,我们需要停止循环,则可以下面的三种方式:1.在while语句中设定条件语句,条件不满足,则循环自动停止:ie: 只输出3的倍数的循环;范围:0到20.current_number = 0while current_number < 20:current_...
  • MIPS汇编 实现循环分支

    千次阅读 2020-11-09 10:11:21
    目录 ... 概述 MIPS汇编实现循环汇编,主要实现C语言中的三类语句: if-else分支语句 while-for循环语句 switch-case分支选择 if-else while-for switch-case ...
  • 关于while(--i)延时讨论

    2020-08-10 18:59:27
    很多人从汇编转到C语言后感到不是非常适应,特别是一些要求比较高的延时程序,感觉C的操控性没有汇编那么高。...很多人单总线的程序的时候一般是在C中嵌入汇编。这是最直观的一种方法。但不是最方便的。
  • 汇编作业一 使用循环计算1-100累加结果

    万次阅读 多人点赞 2019-08-03 16:31:23
    汇编作业一 题目:按下面的程序框架编程,使用循环语句计算1+2+3+…+100,并把结果保存在物理地址12345H指向的字存储单元中。 CODES SEGMENT ASSUME CS:CODES START: ;此处输入功能实现代码 MOV AH,4CH INT 21...
  • 很早以前(DOS+win98时代),我被教育说while比for循环效率高。当时测试的结果也确实是。但测试用例忘记了。现在,如下2个函数,算法是一样的,执行效果也一样int log2_while(int n){int res = 0;while((n>>=1))...
  • 同样是无限循环,for和while所执行的汇编指令差的还是挺多的,所以这里使用for(;;)就不足为怪了 c文件获取到汇编代码指令:gcc -S test.c 您觉得是不是这方面的区别呢?欢迎各路大神围观留言,北京骑行爱好者...
  • C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件测试和跳转组合起来实现循环的效果。...do-while循环其通用形式是这样的:do body-statementwhile...
  • C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件测试和跳转组合起来实现循环的效果。...do-while循环 其通用形式是这样的: do body-statem...
  • C 语言考点解析循环语句和循环函数 2020 年 9 月计算机二级 C 语言考点解析循环语句和循环函数 循环语句和循环函数 Turbo C 2.0 提供三种基本的循环语句 : for 语句 while 语句和 do-while 语句 一循环语句 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,722
精华内容 15,888
热门标签
关键字:

如何用汇编写while的循环