汇编-loop循环指令

LOOP指令是根据ECX计数器循环,将语句块重复执行特定次数。

ECX自动作为计数器, 每重复循环一次就递减1。

语法如下所示:

循环目的地址必须在距离当前位置计数器的-128到+127字节范围内

LOOP指令的执行有两个步骤:

第一步, 将ECX减1;

第二步, 将ECX与0比较。如果ECX不等于0, 则跳转到标号destination。如果ECX等于0, 则不发生跳转, 控制将被传递到循环后面的指令

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data

.code
main PROC
        
        mov eax,0 
        mov ecx, 5
        L1:
        inc eax 
        loop L1

        
    INVOKE ExitProcess,0
main ENDP
END  main

在上面的例子中,每次循环都将EAX加1。当循环结束时, EAX=5, ECX= 0

一个常见的编程错误是, 在循环开始之前, 无意中将ECX初始化为0。如果发生了这种情况, LOOP指令将ECX减1后, 其值就变为FFFF FFFFh,循环次数就变成了4294967296

嵌套循环

嵌套循环当在一个循环中再创建一个循环时,就必须特别考虑外层的循环计数器ECX, 可以将它保存在一个变量中:
 

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
count DWORD ?

.code
main PROC
        
        mov eax,0
        mov ecx, 100       ;设置外层循环计数值
     L1:
        mov count, ecx      ;保存外层循环计数值
        mov ecx, 20          ;设置内层循环计数值
     L2:
        inc eax
        loop L2
        mov ecx, count       ;恢复外层循环计数值
        loop L1
        ;EAX = 000007D0h=2000

        
    INVOKE ExitProcess,0
main ENDP
END  main

实例一:整数数组求和

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
intarray DWORD 10000h, 20000h, 30000h, 40000h


.code
main PROC
        
        mov edi, OFFSET intarray         ;EDI =intarray的地址

        mov ecx, LENGTHOF intarray        ;数组元素个数,循环次数
        mov eax,0                         ;eax用来保存和
     Ll:
        add eax, [edi]
        add edi, TYPE intarray           ;增量:单个元素的字节数
        loop Ll

        ;EAX = 000A0000h
        
    INVOKE ExitProcess,0
main ENDP
END  main

64位汇编

在64位模式中, LOOP指令用RCX作为循环计数器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值