111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:3097回复:0

经典汇编语言教程:5.2.9-条件转移指令

楼主#
更多 发布于:2013-01-24 14:31

条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段。微机的指令系统提供了丰富的条件转移指令来满足各种不同的转移需要,在编程序时,要对它们灵活运用。
条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条件转移指令。
◆、无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data)[table][tr][td]
指令的助忆符[/td][td]检测的转移条件[/td][td]功能描述[/td][/tr][tr][td]
JE/JZ[/td][td]ZF=1[/td][td]Jump Equal or Jump Zero[/td][/tr][tr][td]
JNE/JNZ[/td][td]ZF=0[/td][td]Jump Not Equal or Jump Not Zero[/td][/tr][tr][td]
JA/JNBE[/td][td]CF=0 and ZF=0[/td][td]Jump Above or Jump Not Below or Equal[/td][/tr][tr][td]
JAE/JNB[/td][td]CF=0[/td][td]Jump Above or Equal or Jump Not Below[/td][/tr][tr][td]
JB/JNAE[/td][td]CF=1[/td][td]Jump Below or Jump Not Above or Equal[/td][/tr][tr][td]
JBE/JNA[/td][td]CF=1 or AF=1[/td][td]Jump Below or Equal or Jump Not Above[/td][/tr][/table]
◆、有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data)[table][tr][td]
指令的助忆符[/td][td]检测的转移条件[/td][td]功能描述[/td][/tr][tr][td]
JE/JZ[/td][td]ZF=1[/td][td]Jump Equal or Jump Zero[/td][/tr][tr][td]
JNE/JNZ[/td][td]ZF=0[/td][td]Jump Not Equal or Jump Not Zero[/td][/tr][tr][td]
JG/JNLE[/td][td]ZF=0 and SF=OF[/td][td]Jump Greater or Jump Not Less or Equal[/td][/tr][tr][td]
JGE/JNL[/td][td]SF=OF[/td][td]Jump Greater or Equal or Jump Not Less[/td][/tr][tr][td]
JL/JNGE[/td][td]SF≠OF[/td][td]Jump Less or Jump Not Greater or Equal[/td][/tr][tr][td]
JLE/JNG[/td][td]ZF=1 or SF≠OF[/td][td]Jump Less or Equal or Jump Not Greater[/td][/tr][/table]
◆、特殊算术标志位的条件转移指令(Jumps Based on Special ArithmeticTests)[table][tr][td]
指令的助忆符[/td][td]检测的转移条件[/td][td]功能描述[/td][/tr][tr][td]
JC[/td][td]CF=1[/td][td]Jump Carry[/td][/tr][tr][td]
JNC[/td][td]CF=0[/td][td]Jump Not Carry[/td][/tr][tr][td]
JO[/td][td]OF=1[/td][td]Jump Overflow[/td][/tr][tr][td]
JNO[/td][td]OF=0[/td][td]Jump Not Overflow[/td][/tr][tr][td]
JP/JPE[/td][td]PF=1[/td][td]Jump Parity or Jump Parity Even[/td][/tr][tr][td]
JNP/JPO[/td][td]PF=0[/td][td]Jump Not Parity or Jump Parity Odd[/td][/tr][tr][td]
JS[/td][td]SF=1[/td][td]Jump Sign (negative)[/td][/tr][tr][td]
JNS[/td][td]SF=0[/td][td]Jump No Sign (positive)[/td][/tr][/table]
例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 评分0
游客

返回顶部