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指令改为条件转移指令 | |