Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381442
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:32:06

条件转移指令Jcc根据指定的条件确定程序是否发生转移。如果满足条件则程序转移到目标地址去执行程序;不满足条件,则程序将顺序执行下一条指令。


其通用格式为:
Jcc LABEL ;条件满足,发生转移:IP←IP+8位位移量
;否则,顺序执行:IP←IP+2
其中,LABEL表示目标地址(8位位移量)。因为Jcc指令为2个字节,所以顺序执行就是指令偏移指针IP加2。条件转移指令跳转的目标地址只能用前面介绍的段内短距离跳转(短转移),即目标地址只能是在同一段内,且在当前IP地址-128~+127个单元的范围之内。这种寻址方式由于是相对于当前IP的,所以被称为相对寻址方式。条件转移指令不影响标志,但要利用标志。条件转移指令Jcc中的cc表示利用标志判断的条件,共16种。如下图:



1、判断单个标志位状态
这组指令单独判断5个状态标志之一,根据某一个状态标志是0或1决定是否跳转。
(1)JZ/JE和JNZ/JNE利用零标志ZF,判断结果是否为零(或相等)
JE指令(相等时转移)
JZ指令(等于0时转移)
这是当ZF=1时转移到目标地址的条件转移指令的两种助记符。这条指令既适用于判断无符号数的相等,又适用于判断带符号数的相等。
JNE指令(不相等转移)
JNZ指令(不等于0转移)
这是当ZF=0时能转移到目标地址的条件转移指令的两种助记符。这条指令也是既适用于判断无符号数,又适用于判断带符号数。
(2)JS和JNS利用符号标志SF,判断结果是正是负。
JS指令(为负转移)——当满足SF=1时,转移到目标地址
JNS指令(为正转移)——满足SF=0时,转移到目标地址
(3)JO和JNO利用溢出标志,判断结果是否产生溢出
JO指令(溢出转移)——OF=1时,转移到目标地址
JNO指令(未溢出转移)——OF=0时,转移到目标地址
(4)JP/JPE和JNP/JPO利用奇偶标志PF,判断结果中“1”的个数是偶是奇
JP/JPE指令(为偶转移)——满足PF=1时转移
JNP/JPO指令(为奇转移)——满足PF=0时转移
数据通讯为了可靠常要进行校验。常用的校验方法是奇偶校验,即把字符ASCII码的最高位用作校验位,是包括校验位在内的字符中为“1”的个数恒为奇数(奇校验),或恒为偶数(偶校验)。若采用奇校验,在字符ASCII中为“1”的个数已为奇数时,则令其最高位为“0”;否则令最高位为“1”。
(5)JC/JB/JNAE和JNC/JNB/JAE,利用进位标志CF,判断结果是否进位或借位,CF标志是比较常用的一个标志。
JC——满足CF=1时转移 JNC——满足CF=0时转移
JB(低于转移) JNB(不低于转移)
JNAE(不高于等于转移) JAE(高于等于转移)
2、用于比较无符号数高低
为区别有符号数的大小,无符号数的大小用高(Above)、低(Below)表示,它需要利用CF确定高低、利用ZF标志确定相等(Equal)。两数的高低分成4种关系:低于(不高于等于)、不低于(高于等于)、低于等于(不高于)、不低于等于(高于);也就分别对应4条指令:JB(JNAE)、JNB(JAE)、JBE(JNA)、JNBE(JA)。
JA/JNBE
JA即高于转移,JNBE即不低于且不等于转移,高于则没有进位产生,即CF=0,不等于则ZF=0,所以这两条指令满足CF=0且ZF=0时转移
JAE/JNB
高于或等于转移/不低于转移是当CF=0(高于就不产生进位)或ZF=1(等于)时转移。
JB/JNAE
即低于/不高于且不等于转移,是当CF=1(产生借位)且ZF=0(不相等)时转移。
JBE/JNA
即低于或等于/不高于转移,是当CF=1(借位产生)或ZF=1(相等)时转移。
3、用于比较有符号数大小
判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否。两数的大小分成4种关系:小于(不大于等于)、不小于(大于或等于)、小于等于(不大于)、不小于等于(大于);也就分别对应4条指令:JL(JNGE)、JNL(JGE)、JLE(JNG)、JNLE(JG)。
由上可见,条件转移指令之前常有CMP、TEST、加减运算、逻辑运算等影响标志的指令,利用这些指令执行后的标志或其组合状态形成条件。
JG/JNLE
大于/不小于且不等于转移,是当标志SF与OF同号(即=0)且ZF=0时转移
JGE/JNL
大于或等于/不小于转移,是当标志SF与OF同号(即=0)或ZF=0时转移
JL/JNGL
小于/不大于也不等于时转移,是当标志SF与OF异号(即=1)且ZF=0时转移
JLE/LNG
小于或等于/不大于转移,是当标志SF与OF异号(即=1)或ZF=1时转移
4、判断计数器CX是否为0
JCXZ LABEL ;CX=0,则转移;否则顺序执行

无条件转移:

Intel 8086中,程序的执行序列是由代码段寄存器CS和指令指针IP确定的。CS包含当前指令所在代码段的段地址,IP则是要执行的下一条指令的偏移地址。程序的执行一般是依指令序列顺序执行,但有时候需要改变程序的流程,实现分支程序。控制转移类指令通过修改CS和IP的值改变程序的执行顺序,实现分支。分支程序有时根据某个条件转移执行,有时无条件条转到某条指令执行,转移指令的目标地址是代码段中某个指令的位移量,这个位移量是用标号来指出的。

一、标号
标号(过程名亦视为标号)用来说明可执行指令在汇编语言程序中的位置(从这个角度来说,变量应用于说明伪指令的位置)。标号可以作为转移指令(或调用指令CALL)的操作数。和变量类似,标号有三种属性:段(SEGMENT)、位移量(OFFSET)和距离(DISTANCE)(有的书上称类型属性)。段和位移量属性就是在哪个段、什么位置上定义的标号。标号只要有了定义,这两个属性就自然的产生。如果标号只能在本段中(即标号所定义的段中)用JMP或条件转移指令(或CALL)进行访问,那么必须将这个标号的距离属性定义为NEAR;如果标号能为其他段中的JNMP(或CALL)指令访问,则需将标号的距离属性定义为FAR。标号的距离属性需要再定义标号时指出。
1、标号的定义
(1)定义距离属性为NEAR的标号
1)距离属性为NEAR的标号可以用隐含的说明,即在标号名后面加上冒号,放在指令前面。如:
L1: MOV AX,BX
@: ADD AX,100
2)距离属性为NEAR的标号也可以用现实说明,即用LABEL位指令明显说明,或在EQU位指令中用THIS操作符明显的指出。如:
L2 LABEL NEAR
MOV CX,5
L3 EQU THIS NEAR
AND AX,0FFH
(2)定义距离属性为FAR的标号
距离属性为FAR的标号只能显示说明
L4 LABEL FAR
MOV AX,DX
L5 EQU THIS FAR
OR AL,30H
(3)同一条指令处可以定义两个距离属性不同的标号,以提高访问标号的灵活性。
L6 LABEL FAR
L7: XOR AX,0F0H
其中,标号L6和L7的段属性和位移量属性是一样的,而距离属性不同,L6位FAR,7位NEAR.其他段的JMP指令转移到此处时,用L6作为JMP指令的操作数(目标地址);而本段的JMP指令或条件转移指令转移到此处时,用L7作为指令操作数。
2、允许对标号进行操作的数值返回操作符
(1)SEG 标号名
返回标号所在段的基址
(2)OFFSET 标号名
返回标号所在段的位移量
(3)TYPE 标号名
返回标号的属性NEAR或FAR
二、无条件转移指令
所谓无条件转移,就是无任何先决条件就能使程序改变执行顺序。处理器只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令。
JMP LABEL ;程序专项LABEL标号制定的地址
操作数LABEL使要转移到目标地址,也称为目的地址、转移地址。LABEL操作数的寻址方法可以是直接寻址或间接寻址。JMP指令可以讲程序转移到1MB存储空间的任何位置。根据跳转的距离,JMP指令分成了段内转移和段间转移。
●段内转移是指在单前代码段K范围内转移,因此不需要更改CS段地址,只要改变IP偏移地址。如果转移范围可以用一个字节(-128~+127)表达,则可以形成所谓的“短转移 SHORT JMP”;如果地址位移用一个16位数表达,则形成“近转移 NEAR JMP”,它是在+/-32KB范围。
●段间转移是指从当前代码段跳转到另一个代码段,此时需要更改CS段地址和IP偏移地址。这种转移也称为“远转移 FAR JMP”;转移的目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址。
由此,JMP指令根据目标地址不同的提供方法和内容,可分成四种格式:
1、段内转移,直接寻址
JMP LABEL ;IP←IP+位移量
其中位移量是指紧接着JMP指令后的那条指令的偏移地址,到目标地址的偏移地址的地址位移。当向地址增大的方向转移时,位移量为正;向地址减小方向转移时,位移量为负。汇编程序能够根据位移量的大小自动形成短转移或近转移。同时,汇编程序也提供了短转移SHORT和近转移NEAR PTR操作符,用于强制产生相应的指令格式。
JMP SHORT LABEL
JMP NEAR PTR LABEL
2、段内转移,间接寻址
JMP R16/M16 ;IP←R16/M16
这种形式的JMP指令,将一个16位寄存器或主存单元内容送至IP寄存器,作为新的指令指针,但不修改CS寄存器的内容。如:
JMP AX
JMP WORD PTR [2000H]
3、段间转移,直接寻址
JMP FAR PTR LABEL ;IP←LABEL的偏移地址,CS←LABEL的段地址
段间直接转移指令,是将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样程序就能跳转到新的代码段执行。一个标号是在同一个段内还是在另一个段中,汇编程序能够自动识别,如果要强制衣个段间远转移,则可以用汇编伪指令FAR PTR。如:
CODE1 SEGMENT ;代码段1
......
JMP FAR PTR OTHERSEG ;远转移到代码段2的OTHERSEG
......
CODE1 ENDS ;代码段1结束
CODE2 SEGMENT
......
OTHERSEG: .....
.....
CODE2 ENDS
4、段间转移,间接寻址
JMP FAR PTR MEM ;IP←[MEM],CS←[MEM+2]
段间间接转移指令,用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中,其中地位字送IP寄存器,高位字送CS寄存器。
MOV WORD PTR [BX],0
MOV WORD PTR [BX+2],1500H
JMP FAR PTR [BX]


--------------------next---------------------

阅读(4621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~