
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
