测试条件:(SFVOF)VZF=0
(4)测试CX的值为0则转移指令
JCXZ(Jump if CX register is zero)CX寄存器的内容为零则转移 格式:JCXZ OPRD 测试条件:(CX)=0
注释:条件转移全为8位短跳~! }
下面的程序测试AX的低4位是否全是0,如果均是是0,那么使CX=0,否则使CX=-1 MOV CX,-1 ;先将CX=-1 TEST AX,0FH ;测试AX的低4位 JNZ NZERO ;不全为0则转移 MOV CX,0 ;全为0时使CX=0 NEZRO: ……
可以看出有符号数间的次序关系称为大于(G)、等于(E)、小于(L);无符号数间的次序关系称为高于(A)、等于(E)、和低于(B)。所以,在使用时要注意区分它们。
下面程序实现两个无符号数(设在AX和BX中)的比较,把较大的数存放到AX中,把较小的数存放在BX中; CMP AX,BX JAE OK XCHG AX,BX OK:……
如果要比较的两个数是有符号数,则可用下面的程序片段: CMP AX,BX JGE OK XCHG AX,BX OK:……
无符号数之间大小比较后的条件转移指令和有符号数之间的大小比较后的条件转移指令测试的标志完全不同。无符号数和有符号数,两数是否相等可由ZF标志的反应。进位标志CF反应两个无符号数比较后的大小关系。两个有符号数比较后的大小关系由符号标志SF和溢出标志OF一起来反映。
设要比较的两个不相等的有符号数a和b分别存放在寄存器AX和BX中,执行指令“CMP AX,BX”
后,标志SF及OF的设置情况和两数的大小情况如下: 当没有溢出(OF=0)时,若SF=0,则a>b 若SF=1,则a
当产生溢出(OF=1)时,若SF=0,ab
例如:设X、Y均为存放在X和Y单元中的16位操作数,先判X>50否,如满足条件则转移到TOO-HIGH去执行,然后做X-Y,如溢出则转移到OVER去执行,否则计算|X-Y|,并把结果存入RESULT中。 MOV AX,X CMP AX,50 JG TOO-HIGH SUB AX,Y JO OVER JNS NONE NEG AX
NONE:MOV RESULT ,AX TOO-HIGH: VOER: 3.循环指令
利用条件转移指令和无条件转移指令可以实现循环,但是为了更加方便于循环的实现,8086 8088还提供了四条用于实现循环的循环指令。循环指令类似于条件转移指令,不公属于段内转移,而且也采用相对转移的方式,即通过在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 格式:LOOPNE 标号 LOOPNZ 标号
这条指令使寄存器CX的值减1,如果结果不为0不相等时,并且零标志ZF等于0,那么则转移到标号,否则顺序执行。CX减1操作部影响标志位。 (4)跳转指令JCXZ 格式:JCXZ 标号
该指令实现当寄存器CX的值等于0时转移到标号,否则顺序执行。通常该指令用在循环开始前,以便在循环次数为0时,跳过循环体。
例如:JCXZ OK NEXT:…… LOOP NEXT OK:……