转移指令
8086/8088提供了大量用于控制程序流程的指令,按功能可分成如下四类:
(1)无条件转移指令和条件转移指令;
(2)循环指令;
(3)过程调用和过程返回指令;
(4)软中断指令和中断返回指令。
由于程序代码可以分为多个段,所以根据转移时是否重置代码段寄存器CS的内容,它们又可分为段内转移和段间转移两大类。段内转移是指仅重新设置指令指针IP的转移,由于没有重置CS,所以转移后继续执行的指令仍在同一个代码段中。条件转移指令和循环指令只能实现段内转移。段间转移是指不仅重新设置IP,而且重新设置代码段寄存器CS的转移,由于重置CS,所以转移后继续执行的指令在另一段中。软中断指令和中断返回指令总是段间转移。无条件转移指令和过程调用及返回指令既可以是段内转移,也可以是段间转移。段内转移也称为近转移,而段间转移也称为远转移。
对无条件转移指令和过程调用指令而言,按确定转移目的地址的方式还可分为直接转移和间接转移两种。
下面介绍无条件转移指令﹑条件转移指令和循环指令。这些指令均不影响标志。
1.无条件转移指令
1)无条件段内直接转移指令
无条件段内直接转移指令的使用格式如下:
JMP 标号
这条指令使控制无条件地转移到标号地址处。例如:
NEXT: MOV AX,CX
……
JMP NEXT ;转NEXT处
……
JMP OVER ;转OVER处
……
OVER: MOV AX,1
无条件段内直接转移指令对应的机器指令格式如下,由操作码和地址差值构成。
| 指令操作码 |
地址差 |
其中的地址差是程序中该无条件转移指令的下一条指令的开始地址到转移目标地址(标号所指定指令的开始地址)的差值,由汇编程序在汇编时计算得出。因此,在执行无条件段内转移指令时,实际的动作是把指令中的地址差加到指令指针IP上,使IP之内容为目标地址,从而达到转移的目的。图2.20是无条件段内转移指令的存储和执行示意图。请注意,指令中的地址差值由汇编程序计算得出。
段内无条件直接转移指令中的地址差可用一个字节表示,也可用一个字表示。如果地址差值只要用一个字节表示,就称为短转移;如果地址差要用一个字表示,就称为近转移。一个字节表示的地址差的范围是-128至 128,所以,如果以转移指令本身为基准,那么短转移的范围则在-126至 129之间。一个字表示的地址差的范围是0至65535,当IP与地址差之和超过65535时,那么便在段内反饶(即取65536的模),所以,近转移的范围是整个段。
如果当汇编程序汇编到该转移指令时能够正确地计算出地址差,那么汇编程序就根据地址差的大小,决定使用一个字节表示地址差,还是使用一个字表示地址差。例如,上例中的“JMP NEXT”指令。如果当汇编程序汇编到该指令时还不能计算出地址差,那么汇编程序就按两字节地址差汇编此转移指令。例如,上例中的“JMP OVER”指令。对于后一种情况,如果程序员在写程序时能估计出一字节就可表示地址差,那么可在标号前加一个汇编程序操作符SHORT,例如:
JMP SHORT OVER
这样汇编程序就按一字节的地址差汇编此转移指令。当实际的地址差无法用一个字节表示时,汇编程序会发出汇编出现错误的提示信息。
这种利用目标地址与当前转移指令本身地址之间的差值记录转移目标地址的转移方式也称为相对转移。相对转移有利于程序的浮动。
储存器
| …… |
| 78 |
| 56 |
| …… |
| |
| …… |
| op |
| 34 |
| 12 |
| …… |
| MOV AX,1 |
| …… |
DS : 1234
原IP=XXXX
新IP=5678
图2.20 无条件段内间接转移指令示意图
2)无条件段内间接转移指令
无条件段内间接转移指令的格式如下:
JMP OPRD
这条指令使控制无条件地转移到由操作数OPRD的内容给定的目标地址处。操作数OPRD可以是通用寄存器,也可以是字存储单元。例如:
JMP CX ;CX寄存器的内容送IP
JMP WORD PTR [1234H] ;字存储单元[1234H]的内容送IP
图2.21给出了上述指令的存储和执行示意图。其中假设当前数据段偏移1234H处字单元的内容是5678H。
3) 无条件段间直接转移指令
无条件段间直接转移指令的使用格式如下:
JMP FAR PTR 标号
这条指令使控制无条件地转移到标号所对应的地址处。标号前的符号“FAR PTR”向汇编程序说明这是段间转移。只有当标号具有远属性,且标号处的指令已先被汇编的情况下,才可省去远属性的说明“FAR PTR”。
例如:
JMP FAR PTR EXIT ;EXIT是定义在另一个代码段中的标号
无条件段间直接转移指令的机器指令格式如下,由操作码及包括段值和偏移的地址构成。
| 指令操作码 |
目标地址偏移 |
目标地址段值 |
无条件段间直接转移指令的具体动作是把指令中包含的目标地址的段值和偏移分别置入CS和IP。
这种指令中直接包含转移目标地址的转移方式称为绝对转移。
4) 无条件段间间接转移指令
无条件段间间接转移指令的格式如下;
JMP OPRD
这条指令使控制无条件地转移到由操作数OPRD的内容给定的目标地址处。操作数OPRD必须是双字存储单元。例如:
JMP DWORD PTR [1234H] ;双字存储单元的低字内容送IP
;双字存储单元的高字内容送CS


