第9章 转移指令的原理
可以修改IP
,或同时修改CS
和IP
的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。
8086CPU的转移行为有以下几类。
- 只修改
IP
时,称为段内转移,比如:jmp ax
。
- 同时修改
CS
和IP
时,称为段间转移,比如:jmp 1000:0
。
由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。
- 短转移IP的修改范围
-128~127
。
- 近转移IP的修改范围
-32768~32767
。
8086CPU的转移指令分为以下几类。
- 无条件转移指令(如:
jmp
)
- 条件转移指令
- 循环指令(如:
loop
)
- 过程
- 中断
这些转移指令转移的前提条件不同,但转移的基本原理是相同的。我们在这一章主要通过深入学习无条件转移jmp来理解CPU执行转移指令的基本原理。
9.1 操作符 offset
操作符 offset 在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。比如下面的程序:
asssume cs:codesg
codesg segment
start:mov ax,offset start ;相当于mov ax,0
s: mov ax,offset s ;相当于mov ax,3
codesg ends
end start
在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3,所以指令:
mov ax,offset start相当于 mov ax,0,因为start是代码段中的标号,它所标记的指令是代码段中的第一条指令,偏移地址为0;
mov ax,offset s 相当于 mov ax,3,因为s是代码段中的标号,它所标记的指令是代码段中的第二条指令,第一条指令长度位3个字节,则s的偏移地址为3。
问题 9.1
有如下程序段,添写两条指令,使该程序在运行中将s处的一条指令复制到s0处。
assume cs:codesg
codesg segment
s: mov ax,bx ;mov ax,bx的机器码占两个字节
mov si,offset s
mov di,offset s0
____________
____________
s0: nop ;nop的机器码占用一个字节
nop
codesg ends
end s
思考后看分析。
分析:
- s和s0处的指令所在的内存单元的地址是多少?cs:offset s和cs:offset s0。
- 将s处的指令复制到s0处,就是将cs:offset s处的数据复制到cs:offset s0处。
- 段地址已知在cs中,偏移地址offset s和 offset s0 已经送入si和di中。
4.要复制的数据有多长?mov ax,bx指令的长度位两个字节,即1个字。
程序如下。
assume cs:codesg
codesg segment
s: mov ax,bx ;mov ax,bx的机器码占两个字节
mov si,offset s
mov di,offset s0
mov ax,cs:[si]
mov cs:[di],ax
s0: nop ;nop的机器码占用一个字节
nop
codesg ends
end s
9.2 jmp指令
jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
jmp指令要给出两种信息:
- 转移的目的地址
- 转移的距离(段间转移、段内短转移、段内近转移)
不同的给出目的地址的方法,和不同的转移位置,对应有不同格式的jmp指令。下面的几节内容中,我们以给出目的地址的不同方法为主线,讲解jmp指令的主要应用格式和CPU执行转移指令的基本原因。
9.3 依据位移进行转移的jmp指令