ITEEDU

2、条件转移指令(Transfer Conditionally)

条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰富的条件转移指令来满足各种不同的转移需要,在编程序时,要对它们灵活运用。

条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条件转移指令。

无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data)

指令的助忆符 检测的转移条件 功能描述
JE/JZ ZF=1 Jump Equal or Jump Zero
JNE/JNZ ZF=0 Jump Not Equal or Jump Not Zero
JA/JNBE CF=0 and ZF=0 Jump Above or Jump Not Below or Equal
JAE/JNB CF=0 Jump Above or Equal or Jump Not Below
JB/JNAE CF=1 Jump Below or Jump Not Above or Equal
JBE/JNA CF=1 or AF=1 Jump Below or Equal or Jump Not Above
有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data)

指令的助忆符 检测的转移条件 功能描述
JE/JZ ZF=1 Jump Equal or Jump Zero
JNE/JNZ ZF=0 Jump Not Equal or Jump Not Zero
JG/JNLE ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal
JGE/JNL SF=OF Jump Greater or Equal or Jump Not Less
JL/JNGE SF≠OF Jump Less or Jump Not Greater or Equal
JLE/JNG ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater
特殊算术标志位的条件转移指令(Jumps Based on Special Arithmetic Tests)

指令的助忆符 检测的转移条件 功能描述
JC CF=1 Jump Carry
JNC CF=0 Jump Not Carry
JO OF=1 Jump Overflow
JNO OF=0 Jump Not Overflow
JP/JPE PF=1 Jump Parity or Jump Parity Even
JNP/JPO PF=0 Jump Not Parity or Jump Parity Odd
JS SF=1 Jump Sign (negative)
JNS SF=0 Jump No Sign (positive)
例5.15 编写一程序段,它把寄存器AX-BX的绝对值存入BX中。

解:

 next: …
 SUB BX, AX
 JNS next
 NEG BX
 …
例5.16 已知一个字节变量char,试编写一程序段,把其所存的大写字母变成小写字母。

解:

 next: …
 char  DB  'F'    ;变量说明
 …
 MOV AL, char
 CMP AL, 'A'
 JB   next      ;注意:字符是无符号数,不要使用指令JL 
 CMP AL, 'Z'
 JA   next
 ADD char, 20H  ;小写字母比大写字母的ASCII码大20H 
 …

如果不知道(或忘了)大小写字母ASCII码之间的关系,那么,可用数值表达式'a'-'A'、'b'-'B'、…、'z'-'Z'等来代替具体的数值20H。

例5.17 编写一段程序,完成下面计算公式,其中:变量X和Y都是字类型。

解:

 …
 X    DW      ;变量说明
 Y    DW  ?
 … 
 MOV  AX, X
 MOV BX, AX   ;用BX来临时存放计算结果
 CMP  AX, 0
 JLE   setdata
 CMP  AX, 500
 JG   case3
 ADD  BX, 100D? ;BX=X+100
 JMP   setdata
 next:   SUB BX, 50D  ;BX=X-50
 setdata: MOV Y, BX    ;把计算结果赋给变量Y
 …
例5.18 下面循环体的指令代码字节数超过128,试改写该循环。

MOV CX, COUNT ;给循环计数器赋初值(>0)

again: 循环体指令序列 ;循环体的首地址偏移量大于128

LOOP again

解:

 …
 MOV CX, COUNT
 again:   循环体指令序列
 DEC CX
JNZ again  ;把LOOP指令改为条件转移指令