16位CPU内部有一个16位的标志寄存器,它包含9个标志位。这些标志位主要用来反映处理器的状态和运算结果的某些特征。各标志位在标志寄存器内的分布如图2.2所示。
|
| 31 | … | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| … | … | VM | RF | NT | IOPL | OF | DF | IF | TF | SF | ZF | AF | PF | CF |
图2.2 16位/32位标志寄存器的示意图
上面9个标志位可分为二组:运算结果标志位(有背景色的标志位)和状态控制标志位。前者受算术运算和逻辑运算结果的影响,后者受一些控制指令执行的影响。
条件转移指令(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指令改为条件转移指令 | |
本文介绍了16位CPU中的标志寄存器及其包含的9个标志位,分为运算结果标志位和状态控制标志位。详细解释了基于不同条件的条件转移指令,包括无符号数、有符号数和特殊算术标志位的条件转移,并通过实例展示了其应用。
4084

被折叠的 条评论
为什么被折叠?



