汇编(十五)——控制转移类指令一

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指令分成了段内转移和段间转移。
●段内转移是指在单前代码段64K范围内转移,因此不需要更改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]

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值