循环指令类似于条件转移指令,不公属于段内转移,而且也采用相对转移方式,即通过在IP上加一个地址差的方式实现转移,循环指令中也只用一个字节表示地址差,所以如果以循环指令本身作为基准,那么循环转移的范围在-126到+129之间。
循环指令不影响各标志。
(1)计数循环指令LOOP
计数循环指令格式如下:LOOP 标号
这条指令使寄存器CX的值减1,如果结果不等于0,则转到标号,否则顺序执行。
该指令类似如下两条指令:
DEC CX
JNZ 标号
通常在利用LOOP指令构成循环时,先要设置好计数器CX的值(循环计数次数),由于首先进行CX寄存器减1操作,再判断结果是否为0,所以最多可循环65536次。
例:如下程序片段实现把从便宜1000H开始的512个字节数据复制到从偏移3000H开始的缓冲区中(假设在当前数据段中进行移动)
MOV SI, 1000H
MOV DI, 3000H
MOV CX, 512
NEXT:
MOV AL, [SI]
INC SI
MOV [DI], AL
INC DI
LOOP NEXT
…….
(2)等于/全零循环指令LOOPE/LOOPZ
等于/全零循环指令有两个助记符,格式如下:
LOOPE 标号 或者 LOOPZ 标号
这条指令使寄存器CX的值减1,当为0或相等时,(且零标志ZF等于1),那么则转到标号,否则顺序执行,注意指令本身实施的寄存器CX减1操作不影响标志。
例:字符串汇总查找第一个非‘A’字符。设字符串长度已保存在CX中,并且DS: DI指向字符串。如果找到,那么使BX指向该非‘A’字符,如果找不到,那么使BX=0FFFFH。
MOV AL, ‘A’
DEC DI
NEXT: INC DI
CMP AL, [DI]
LOOPE NEXT
MOV BX, DI
JNE OK
MOV BX, –1
OK: …….
(3)不等于/非零循环LOOPNE/LOOPNZ
这条指令使寄存器CX的值减1,若结果不为0或不相等时,并且ZF等于0,那么则转移到标号,否则顺序执行。CX减1操作不影响标志位。
(4)跳转指令JCXZ
格式:
JCXZ 标号
指令实现当寄存器CX=0时转移到标号,否则顺序执行。
通常该指令用在循环开始前,以便在循环次数位0时,跳出循环体。
例:
JCXZ OK
NEXT:
….
LOOP NEXT
OK: …..