1. 转移地址在内存中的jmp指令有2种形式
1.1 jmp word ptr 内存单元地址
jmp word ptr 内存单元地址是段内转移指令,也就是说该指令只修改IP值,其功能是控制CPU下一条执行的指令是一个字(2个字节)内存中存放的偏移地址所指向的指令。所以,IP和内存单元地址存在关系:(IP) = (内存单元地址)
例如:
mov ax, 12h
mov ds:[0], ax
jmp word ptr ds:[0]
执行该段代码后,(IP) = 0012h
cpp
assume cs:code, ds:data
data segment
dw 8 dup (0) ;定义8个2字节的dw类型数据,并初始化为0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 12h
mov ds:[0], ax
jmp word ptr ds:[0] ;执行该指令后,IP = 0012h
mov ax, 0
add ax, 2
inc ax
mov ax, 4c00h
int 21h
code ends
end start
1.2 jmp dword ptr 内存单元地址
jmp dword ptr 内存单元地址是段间转移指令,也就是说该指令可以同时修改CS和IP值,其功能是控制CPU下一条执行的指令在两个字大小的内存中,其中高字(2字节)内存中存放的是目的段地址(CS),低字(2字节)内存中存放的是目的偏移地址(IP)。
所以,CS和IP跟内存单元地址之间存在以下关系:
(1)(CS) = (内存单元地址+2)
(2)(IP) = (内存单元地址)
例如:
mov ax, 18h
mov ds:[0], ax
mov word ptr ds:[2], 204Eh
jmp dword ptr ds:[0]
;执行该段指令后,CS = 204Eh, IP = 0018h
cpp
assume cs:code, ds:data
data segment
dd 4 dup (0) ;定义4个4字节的dd类型数据,并初始化为0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 18h
mov ds:[0], ax ;低字内存中存放IP
mov word ptr ds:[2], 204Eh ;高字内存中存放CS
jmp dword ptr ds:[0] ;执行该指令后,CS = 204Eh, IP = 0018h
mov ax, 0
add ax, 2
inc ax
mov ax, 4c00h
int 21h
code ends
end start
2. 目的地址在寄存器中的jmp指令
2.1 jmp 16位寄存器
目的地址在寄存器中的jmp指令是段内转移指令,只能修改IP,所以IP和寄存器间存在关系:(IP) = (16位寄存器)
例如
mov ax, 0123h
jmp ax ;执行该指令后,(IP) = 0123h
又例如
mov bx, 0123h
jmp bx ;;执行该指令后,(IP) = 0123h
3. 总结
-
jmp word ptr 内存单元地址 是段内转移指令,只修改IP:(IP) = (内存单元地址)
-
jmp dword ptr 内存单元地址 是段间转移指令,同时修改CS和IP:
(CS) = (内存单元地址 + 2),(IP) = (内存单元地址)
参考文献
《汇编语言(第4版)》王爽