jmp指令――无条件转移
- jmp指令的功能
- 无条件转移,可以只修改IP,也可以同时修改CS和IP
- jmp指令要给出两种信息:
- 转移的目的地址
- 转移的距离
- 段间转移(远转移):jmp 2000:1000
- 段内短转移:jmp short 标号; IP的修改范围为-128~127,8位的位移
- 段内近转移:jmp near ptr 标号;IP的修改范围为-32768~32767,16位的位移
jmp指令:依据位移进行转移
- 引子:常见指令中的立即数均在机器指令中有体现
- 问题:jmp short 指令中,转移到了哪里?
- jmp short的机器指令中,包含的是跳转到指令的相对
位置,而不是转移的目标地址。
- jmp short的机器指令中,包含的是跳转到指令的相对
- 左边程序jmp short s指令的读取和执行:
- (IP)=0003,CS:IP指向EB 05(jmp的机器码)
- 读取指令码EB05进入指令缓冲器;
- (IP)=(IP)+所读取指令的长度=(IP)+2=0005 CS:IP指向add ax, 0001 ;
- CPU执行指令缓冲器中的指令EBO5;
- 指令EB执行后,(IP)=(IP)5-0Q0AH ,CS:IP指向inc ax
两种段内的转移
-
短转移:“jmp short 标号”
- 功能:§=(IP)+8位位移
- 原理
- 8位位移="标号"处的地址-jmp指令后的第一个字节的地址;
- short指明此处的位移为8位位移;
- 位位移的范围为-128~127,用补码
表示; - 8位位移由编译程序在编译时算出。
-
近转移:指令"jmp near ptr标号”
- 功能:(IP)=(IP)+16位位移
- 原理
- 16位位移=“标号"”处的地址-jmp指令后的第一个字节的地址;
- near ptr指明此处的位移为16位位移,进行的是段内近转移;
- 16位位移的范围为-32769~32767,用补码表示;
- 16位位移由编译程序在编译时算出。
-
远转移jmp far ptr标号
- 段间转移
- far ptr指明了跳转到的目的地址,即包含了标号的段地址cs和偏移地址IP。
-
段内转移
- near ptr指明了相对于当前IP的转移位移,而不是转移的目的地址。
转移地址在寄存器中的jmp指令
- 指令格式:jmp 16位寄存器
- 功能:IP= (16位寄存器
- 举例∶
- jmp ax
- jmp bx,
转移地址在内存中的jmp指令
- jmp word ptr内存单元地址(段内转移
- 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
mov ax,0123H
mov ds:[0],ax
jmp word ptr de:[0]
;执行后,(IP)=0123H
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
;执行后,(IP)=0123H
- jmpdworo ptr内存单元地址(段间转移
- 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
;执行后,(CS)=0(IP)=0123H
;CS:IP指向0000:0123
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
;执行后(CS)=0(IP)=0123H
jmp指令格式 | 示例 |
---|---|
jmp 标号 | 段间转移(远转移): jmp far ptr 标号 段内短转移:jmp short 标号;8位的位移 段内近转移:jmp near ptr 标号; 16位的位移 |
jmp 寄存器 | jmp bx; 16位的位移 |
jmp 内存单元(表示跳转到的地址) | 段内转移:jmp word ptr 内存单元地址;jmp word ptr [bx] 段间转移:jmp dword ptr 内存单元地址;jmp dword ptr [bx] |
-
在源程序中,不允许使用“jmp 2000:0100”的转移指令实现段间转移·
-
这是在Debug中使用的汇编指令,汇编编译器并不认识
-
如果在源程序中使用,编译时也会报错。
-