1、可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令,8086CPU的转移行为有两种
(1)只修改IP时,称为段内转移,比如:jmp ax
(2)同时修改CS和IP时,称为段间转移,比如:jmp 1000:0
段内转移又分为
(1)短转移:IP的修改范围为-128~127
(2)近转移:IP的修改范围为-32768~32767
2、操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址
3、jmp指令
jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP
jmp指令要给出两种信息
(1)转移的目的地址
(2)转移的距离(段间转移、段内短转移,段内近转移)
4、依据位移进行转移的jmp指令
给下面一段程序:
assume cs:codesg
codesg segment
start:mov ax,0
mov bx,0
jmp short s
add ax,1
s: inc ax
我们需要知道一个概念:CPU在执行jmp指令的时候并不需要转移的目的地址
为什么?
我们先简单回忆一下CPU执行指令的过程
(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
(2)(IP) = (IP)+ 所读取指令的长度,从而指向下一条指令;
(3)执行指令。转到1,重复这个过程。
按照这个步骤,jmp short s指令的过程如下:
(1)(CS)= 0BBDH,(IP)=0006H,CS:IP指向EB 03(jmp short s 的机器码);
(2)读取指令码EB 03 进入指令缓冲器;
(3)(IP) = (IP)+ 所读取指令的长度 = (IP)+ 2 = 0008H,CS:IP指向add ax,1;
(4)CPU执行指令缓冲器中的指令EB 03;
(5)指令EB 03执行后,(IP) = 000BH,CS:IP指向inc ax
从上面的过程中我们看到,CPU将指令EB 03 读入后,IP指向了下一条指令,接着执行EB 03 如果没有对IP进行修改的话,那么,接下来CPU将执行add ax,1,可是,CPU执行的EB 03却是一条修改IP的转移指令,执行后CS:IP指向inc ax ,CS:0008处的add ax,1没有被执行
在转移指令EB 03中并没有告诉CPU要转移的目的地址,却告诉了CPU要转移的位移
实际上 ,“jmp short 符号”的功能为:(IP) = (IP)+8位位移
“jmp near ptr 标号”的功能为:(IP) = (IP)+16位位移
5、转移的目的地址在指令中的jmp指令
“jmp far ptr 标号”实现的是段间转移,又称远转移
(CS)= 标号所在段的段地址:(IP) = 标号在段中的偏移地址
6、转移地址在寄存器中的jmp指令
指令格式:jmp 16位 reg
功能: (IP) = 16位reg
7、转移地址在内存中的jmp指令
(1)jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址
(2)jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
8、jcxz指令
jcxz指令为有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127
操作:当(cx)=0时,(IP)
jcxz的功能相当于C语言中的:
if((cx )== 0) jmp short 标号;
9、loo[指令
loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为:-128~127
操作:
(1)(cx)= (cx)-1
(2)如果(cx)!=0,(IP) = (IP)+8位位移。
用C语言的语法表示为
(cx)--;
if((cx) != 0) jmp short 标号;
10、根据位移转移的意义
这种设计,方便了程序段在内存中的浮动装配
如果存的时地址,那么当装配地址发生改变时,固定地址后找不到要转移的地址会发生报错,如果依据位移进行转移,就不存在这个问题
11、编译器对转移位移超界的检测
根据位移进行转移的指令,他们的转移范围收到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器会报错