可以修改IP或者CS:IP的指令叫做转移指令.
只修改IP,称为段内转移如jmp ax,根据对IP修改的范围不同分为短转移和近转移,范围分别为-128到127和-32768到32767
同时修改CS和IP的指令称为段间转移,如jmp 1000:0
9.1 offset
offset 标号,用于取标号的偏移地址,如mov ax,offset start 相当于mov ax,0 start为代码段的标号
9.2 jmp指令
jmp是无条件转移指令,可以修改IP或者CS:IP都修改
jmp指令给出以下两种信息之一:
(1)转移目的地址
(2)转移位移
9.3 根据位移进行转移
jmp short 标号 表示段内短转移,8个字节长度表示位移量,因此可以表示范围是:向前转移128字节到向后转移127字节
即 IP=IP+8位位移,8位位移=标号偏移地址 - jmp的下一条指令的偏移地址
jmp near ptr 标号 表示段内近转移,IP=IP+16位位移
这两种转移 在编译器编译后给出目标地址,但是机器码会给出位移地址
9.4 转移的目的地址在指令中
jmp far ptr 标号,实现段间转移也叫远转移,将标号的段地址和偏移地址放入CS:IP中
这种转移 编译器编译后给出目标地址,机器码也指定转移的目标地址
9.5 转移地址在jmp中
jmp 16位reg
IP = 16位reg值
9.6 转移地址在内存中
jmp word ptr 内存单元地址: 将内存单元处字单元作为IP的值
jmp dword ptr 内存单元地址: 将内存单元处第一个字单元作为IP值,第二个字单元作为CS值
检测点9.1
(1) 程序如下:
assume cs:code
data segment
?
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
要使jmp执行后CS:IP指向程度第一条指令,data中应该怎么填?
分析: jmp word ptr [1] 就是把1地址字单元值放入IP,即让CS:IP指向CS:0,所以让1地址字单元值为0
所以data里应该是db 0,0,0
(2)程序如下
assume cs:code
data segment
dd 12345678H
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov [bx],
mov [bx+2],
jmp dword ptr ds:[0]
code ends
end start
补全程序使jmp执行后CS:IP指向程序第一条指令
分析: jmp dword ptr ds:[0] 表示让0地址字单元放入IP2地址字单元放入CS中
所以让0地址字单元变成0,2地址字单元变成CS,
所以: mov [bx],bx 此处不可以用 mov [bx],0 因为需要确定指令数据长度
mov [bx+2],cs
(3)用Debug 查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 .....
则此时,CPU执行指令
mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]
后 CS = 0006H, IP = 00BEH
9.7