-------汇编语言--标志寄存器--转移指令---
2012-06-12 19:58
225 查看
16位CPU内部有一个16位的标志寄存器,它包含9个标志位。这些标志位主要用来反映处理器的状态和运算结果的某些特征。各标志位在标志寄存器内的分布如图2.2所示。
图2.2 16位/32位标志寄存器的示意图
上面9个标志位可分为二组:运算结果标志位(有背景色的标志位)和状态控制标志位。前者受算术运算和逻辑运算结果的影响,后者受一些控制指令执行的影响。
条件转移指令(Transfer Conditionally)
条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰富的条件转移指令来满足各种不同的转移需要,在编程序时,要对它们灵活运用。
条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条件转移指令。
、无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data)
、有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data)
、特殊算术标志位的条件转移指令(Jumps Based on Special Arithmetic Tests)
例5.15 编写一程序段,它把寄存器AX-BX的绝对值存入BX中。
例5.16 已知一个字节变量char,试编写一程序段,把其所存的大写字母变成小写字母。
如果不知道(或忘了)大小写字母ASCII码之间的关系,那么,可用数值表达式'a'-'A'、'b'-'B'、…、'z'-'Z'等来代替具体的数值20H。
例5.17 编写一段程序,完成下面计算公式,其中:变量X和Y都是字类型。
例5.18 下面循环体的指令代码字节数超过128,试改写该循环。
|
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 |
上面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 |
指令的助忆符 | 检测的转移条件 | 功能描述 |
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 |
指令的助忆符 | 检测的转移条件 | 功能描述 |
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) |
解: | |
next: | … |
SUB | BX, AX |
JNS | next |
NEG | BX |
… |
解: | ||
next: | … | |
char | DB 'F' | ;变量说明 |
… | ||
MOV | AL, char | |
CMP | AL, 'A' | |
JB | next | ;注意:字符是无符号数,不要使用指令JL |
CMP | AL, 'Z' | |
JA | next | |
ADD | char, 20H | ;小写字母比大写字母的ASCII码大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 |
… |
… | ||
MOV CX, COUNT | ;给循环计数器赋初值(>0) | |
again: | 循环体指令序列 | ;循环体的首地址偏移量大于128 |
LOOP again |
解: | |
… | |
MOV CX, COUNT | |
again: | 循环体指令序列 |
DEC CX | |
JNZ again | ;把LOOP指令改为条件转移指令 |
相关文章推荐
- 汇编语言-转移指令
- 汇编语言08——转移指令的原理
- 汇编语言入门:转移指令(一)
- 汇编语言入门:转移指令(二)
- 汇编语言复习摘要九——转移指令的原理
- 汇编语言条件转移(短转移)指令列表
- [汇编语言]-第九章 jcxz,loop指令,转移位移的意义
- 汇编语言笔记 转移指令的原理
- 转移指令的原理01 - 零基础入门学习汇编语言43
- <学习笔记>王爽汇编语言__转移指令原理
- 汇编语言学习第九章-转移指令的原理
- 转移指令的原理01 - 零基础入门学习汇编语言43
- 汇编语言学习笔记(九)转移指令的原理
- 【汇编语言/底层开发】9、转移指令的原理
- 转移指令的原理03 - 零基础入门学习汇编语言45
- 汇编语言学习--转移指令的原理
- [汇编语言]-第九章 转移指令的原理
- 转移指令的原理03 - 零基础入门学习汇编语言45
- [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令
- 转移指令的原理02 - 零基础入门学习汇编语言44