返回列表 发帖

[原创] 汇编基础一日一学习10

  大家好,今天我们来学习下loop循环指令。我们高级语言的堆栈分配初始化可是靠它了呵呵。 首先我们来看下它的指令格式。。

        LOOP    标号  ;ECX不为零时跳转至标号循环.标号只是写汇编程序时用来表示一个内存地址的。

例如
token:
     xor eax, eax
此时token等于 xor eax, eax指令的内存地址 。标号格式:“ 标号名称: ”。
      
  从它的指令格式中,我们就可以看出来,它是靠判断ecx寄存器是为0来决定是否往下循环的。那么我们可以由此联想到,每次循环之前我们要对ecx进行赋值,也就是赋上循环次数。。

     
   举例

         mov ecx, 3h ;循环次数
   _loop:;标号,它在汇编中是用来标示内存地址。此时_loop = mov eax, 00304020h的内存地址。它的格式是 标号名:
         mov eax, 00304020h ;循环内容
         add eax, eax ;循环内容
         loop _loop


这里我们来分析下这个循环过程。

      1.  首先程序执行
        mov ecx, 3
        mov eax, 00304020h ;eax = 00304020h
        add eax, eax ; eax = eax+eax
        loop _loop ;执行到这里ecx-1=2,然后cpu判断ecx寄存器是否为0,如果是的话结束循环往下执行,如果不是则跳转到标号处继续执行。。
     
     2  第二次执行
        mov eax, 00304020h ;eax = 00304020h
        add eax, eax ; eax = eax+eax
        loop _loop ; ecx -1 = 1
    ;执行到这里ecx-1=1,然后cpu判断ecx寄存器是否为0,如果是的话结束循环往下执行,如果不是则跳转到标号处继续执行。。

    3  第三次执行
        mov eax, 00304020h ;eax = 00304020h
        add eax, eax ; eax = eax+eax
        loop _loop ; ecx -1 = 0
    ;执行到这里ecx - 1 =0, cpu判断ecx已经是0了,就不接着跳转标号继续循环了,则设置设置eip为下一条指令的偏移,继续开始执行。。


        其实也很简单。。  loop是靠判断ecx寄存器为依据来进行循环的。 loop指令后面跟的是一个内存地址。也就是要进行起始循环指令的地址。 如果ecx不为0,则跳转到起始循环指令的地址开始执行。
     
   

(1)
   利用循环来计算3*3,结果存放到eax寄存器中。(提示:可以循环通过add指令来做累加)。
   注意:这里是计算3乘3的结果。
(2)
    mov eax, 15h
    mov ecx, 2h
   _loop:
    sub eax, 1h
    loop _loop
  此句指令执行后,eax = ?。
希望做站长本人的学生请点击
http://www.3ast.com/viewthread.php?tid=13841
QQ790653916只负责SEO以及收费教学等方面联系,他人勿扰

于智者同行,你会不同凡响;与高人为伍,你会登上巅峰

返回列表