从广义角度讲,凡是能够控制CPU执行内存某处代码的指令都是转移指令。
从狭义角度讲,能修改IP,或者能同时修改CS和IP的指令被称为转移指令。
当转移指令只修改IP时叫做段内转移,同时修改CS和IP时叫做段间转移。
段内转移分为短转移和近转移,这是根据IP修改范围的长度不同而划分的。
短转移中IP的范围是-27~27-1,近转移中IP的范围是-215~215-1。
8086CPU把转移指令分为5种:
1、无条件转移指令。
2、条件转移指令。
3、循环指令
4、过程。
5、中断。
它的功能是取得标号的偏移地址,如下图所示:
而且两个偏移地址之间还可以做减法运算:
9.2 jmp指令
无条件转移指令,用于修改IP或者CS和IP。
它需要两个信息——目的地址和转移的距离。
JMP SHORT标号
short说明这是短转移,即,IP范围是-27~27-1字节。
标号:代码段中的标号,它指明了目的地。
它属于段内转移。
JMP NEAR PTR标号
它是段内近转移。
IP变动范围是-215~215-1,实际的跳跃距离为标号处减去JMP指令后的第一字节地址所得的字节数。
JMP FAR PTR标号
段间转移,远转移。
用标号的段地址和偏移地址修改CS和IP。
JMP WORD PTR内存单元
段内偏移。
该内存单元中存放的字型数据是目的偏移地址。
JMP DWORD PTR内存单元
段间偏移。
内存单元处存放的是双字型,高地址处字存放的是目的端地址,低地址处字存放的是目的偏移地址。
Jumpwhen CX is zero
有条件转移指令,都用于短转移,包含是位移,IP范围是-27~27-1。
格式如下:
JCXZ标号
这条指令只在(CX)=0时有效。
实际位移为标号地址减去JCXZ指令后第一字节地址所得字节数。
在(CX)非0时什么也不做。
循环指令,短指令,它控制的是位移而不是目的地址,IP的移动范围是-27~27-1。
用法如下:
loop标号
它首先判断(CX)是否等于0,如果不等于0再进行(CX)-=1操作。
IP的实际范围是标号处的地址减去loop指令后的第一字节的地址所得的字节数。
这样设计使得指令与具体的物理地址无关而只与位移有关,所以指令可以在可行的任意位置执行。
越界就报错。