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]