汇编语言的标志寄存器和条件转移指令

16CPU内部有一个16位的标志寄存器,它包含9个标志位。这些标志位主要用来反映处理器的状态和运算结果的某些特征。各标志位在标志寄存器内的分布如图2.2所示。

 
1514131211109876543210
        OFDFIFTFSFZF  AF  PF  CF
3117161514131211109876543210
VMRF NTIOPLOFDFIFTFSFZF  AF  PF  CF

图2.2 16位/32位标志寄存器的示意图

上面9个标志位可分为二组:运算结果标志位(有背景色的标志位)和状态控制标志位。前者受算术运算和逻辑运算结果的影响,后者受一些控制指令执行的影响。

条件转移指令(Transfer Conditionally)

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

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

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

指令的助忆符

检测的转移条件功能描述

JE/JZ

ZF=1Jump Equal or Jump Zero

JNE/JNZ

ZF=0Jump Not Equal or Jump Not Zero

JA/JNBE

CF=0 and ZF=0Jump Above or Jump Not Below or Equal

JAE/JNB

CF=0Jump Above or Equal or Jump Not Below

JB/JNAE

CF=1Jump Below or Jump Not Above or Equal

JBE/JNA

CF=1 or AF=1Jump Below or Equal or Jump Not Above

、有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data)

指令的助忆符

检测的转移条件功能描述

JE/JZ

ZF=1Jump Equal or Jump Zero

JNE/JNZ

ZF=0Jump Not Equal or Jump Not Zero

JG/JNLE

ZF=0 and SF=OFJump Greater or Jump Not Less or Equal

JGE/JNL

SF=OFJump Greater or Equal or Jump Not Less

JL/JNGE

SF≠OFJump Less or Jump Not Greater or Equal

JLE/JNG

ZF=1 or SF≠OFJump Less or Equal or Jump Not Greater

、特殊算术标志位的条件转移指令(Jumps Based on Special Arithmetic Tests)

指令的助忆符

检测的转移条件功能描述

JC

CF=1Jump Carry

JNC

CF=0Jump Not Carry

JO

OF=1Jump Overflow

JNO

OF=0Jump Not Overflow

JP/JPE

PF=1Jump Parity or Jump Parity Even

JNP/JPO

PF=0Jump Not Parity or Jump Parity Odd

JS

SF=1Jump Sign (negative)

JNS

SF=0Jump No Sign (positive)

例5.15 编写一程序段,它把寄存器AX-BX的绝对值存入BX中。

解:
next:
SUBBX, AX
JNSnext
NEGBX

例5.16 已知一个字节变量char,试编写一程序段,把其所存的大写字母变成小写字母。

解:
next:
charDB  'F' ;变量说明
MOVAL, char
CMPAL, 'A'
JBnext;注意:字符是无符号数,不要使用指令JL
CMPAL, 'Z'
JAnext
ADDchar, 20H;小写字母比大写字母的ASCII码大20H

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

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

解:
 
XDW  ?;变量说明
YDW  ?
 
MOV AX, X
MOVBX, AX;用BX来临时存放计算结果
CMPAX, 0
JLEsetdata
CMPAX, 500
JGcase3
ADDBX, 100D;BX=X+100
JMP setdata
next:SUBBX, 50D;BX=X-50
setdata:MOVY, BX;把计算结果赋给变量Y

例5.18 下面循环体的指令代码字节数超过128,试改写该循环。

 
MOV CX, COUNT;给循环计数器赋初值(>0)
  again:循环体指令序列;循环体的首地址偏移量大于128
LOOP again
解:
 
MOV CX, COUNT
  again:循环体指令序列
DEC CX
JNZ again;把LOOP指令改为条件转移指令

 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值