jmp 指令
jmp short 标号
jmp near ptr 标号
jmp far ptr 标号
jmp 16位reg
jmp word ptr 内存单元地址
jmp dword ptr 内存单元地址
jmp short 标号
- 段内短转移
- 对IP的修改范围是-128~127
- 向前 移动时可以最多越过128个字节,向后 移动可以最多越过127个字节
- 依据位移进行转移,转移指令结束后,CS:IP指向标号处的指令
- (IP)=(IP)+8位位移
8位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址
8位位移的范围是:-128~127
8位位移使用 补码 形式表示
- 依据位移进行转移,跳转到标号s处开始执行指令
assume cs:codesg
codesg segment
start: mov ax,0
mov bx,0
jmp short s
add ax,1
s: inc ax
codesg ends
end start
jmp near ptr 标号
- 段内近转移
- (IP)=(IP)+16位位移
16位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址
16位位移的范围是:-32768~32767
16位位移使用 补码 形式表示
jmp far ptr 标号
- 段间转移,远转移
- 用标号所在段地址和偏移地址修改CS和IP
(CS) = 标号所在段的段地址
(IP) = 标号在段中的偏移地址
- 依据段地址和偏移地址进行转移
assume cs:codesg
codesg segment
start: mov ax,0
mov bx,0
jmp far ptr s
db 256 dup (0)
s: add ax,1
inc ax
codesg ends
end start
-
读出目的段地址和目的偏移地址
0B016A07
0B
01
-----
010B 目的偏移地址
6A
07
----
076A 目的段地址
CS:IP 指向 076A:010B
jmp 16位reg
-
jmp 某一合法寄存器
: 用寄存器中的值修改IP寄存器中的值
jmp ax
指令执行前 ax=1000H CS=2000H IP=0003H
指令执行后 ax=1000H CS=2000H IP=1000H
IP寄存器中的值被修改成和ax一样的了
jmp word ptr 内存单元地址
- 段内转移,只修改偏移地址
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
执行后 (IP)=0123H
jmp dword ptr 内存单元地址
- 段间转移
- 高地址放 目的段地址,低地址 放 目的偏移地址
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
执行后 (CS)=0, (IP)=0123H,
CS:IP 指向 0000:0123H
附注3:MASM.EXE对JMP的相关处理
- 1、向前转移 disp属于[-128,127]
assume cs:code
code segment
s: jmp s
jmp short s
jmp near ptr s
jmp far ptr s
code ends
end s
- 2、向前转移 disp属于[-32768,32767]
assume cs:code
code segment
s: db 100 dup (0b8h,0,0)
;jmp short s
jmp s
jmp near ptr s
jmp far ptr s
code ends
end s
- 3、向后转移 disp属于[-128,127] EB+disp+NOP 一个NOP存放8位disp
assume cs:code
code segment
begin: jmp short s
jmp s
jmp near ptr s
jmp far ptr s
s: mov ax,0
code ends
end begin
- 4、向后转移 disp属于[-32767,32768]
assume cs:code
code segment
begin: ;jmp short s
jmp s
jmp near ptr s
jmp far ptr s
db 100 dup (0b8h,0,0)
s: mov ax,2
code ends
end begin