80X86学习笔记循环指令

循环指令类似于条件转移指令,不公属于段内转移,而且也采用相对转移方式,即通过在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: …..

原文地址:https://www.cnblogs.com/seebro/p/2426078.html