jmp转移综述
一般情况下指令是顺序地逐条执行的,而在实际中,常需要改变程序的执行流程。
mov ax,0
jmp short s
add ax,1
s:inc ax
转移指令的分类
转移指令
可以控制cpu执行内存中某处代码的指令
可以修改ip或同时修改cs和ip的指令
按转移行为
段内转移 只修改ip如jmp ax
段间转移 同时修改cs和ip如jmp 1000:0
根据指令对ip修改的范围不同
段内短转移 ip修改范围为[-128,127] 8位
段内近转移 ip修改范围为[-32768,32767] 16位
按转移指令
无条件转移指令 如jmp
条件转移指令 如cxz
循环指令 如loop
过程
中断
操作符 offset取得标号的偏移地址
格式: offset 标号
有如下程序段添写2条指令,使该程序在运行中s处的一条指令复制到s0处
jmp指令 无条件转移
无条件转移 可以只修改ip 也可以同时修改cs和ip
jmp指令要给出两种信息
转移的目的地址
转移的举例
段间转移(远转移) jmp 2000:1000 / jmp far ptr 标号
段内短转移jmp short 标号;ip的修改范围为[-128,127] 8位的位移
段内近转移jmp near ptr 标号;ip的修改范围为[-32768,32767]16位的位移
两种段内转移(段内短转移和段内近转移)
短转移 jmp short 标号功能(ip) = (ip) + 8位位移
原理
(1)8位位移 = “标号”处的地址– jmp指令后的第一个字节的地址
(2)short指明此处的位移为8位位移
(3)8位位移的范围[-128,127]用补码表示
(4)8位位移由编译程序在编译时算出
近转移 指令 jmp near ptr 标号 功能 (ip) = (ip)+16位位移
原理
(1)16位位移= “标号”处的地址–jmp指令
(2)near ptr指令此处的位移为16位位移,进行的是段内近转移
(3)16位位移的范围为[-32768,32767],用补码表示
(4)16位位移由编译程序在编译时算法
远转移jmp far ptr 标号(offset)
转移地址在寄存器的jmp指令
指令格式jmp 16寄存器
功能 ip = (16位寄存器)
assume cs:codesg
codesg segment
start:
mov ax,0
mov bx,ax
jmp bx ; 转移到偏移地址为0地址上去(start)因为bx已经被赋值为0
mov ax,0123H
codesg ends
end
举例:
jmp ax
jmp bx
转移地址在内存中的jmp指令
小总结:
注意:
在源程序中不允许使用”jmp 2000:1000”的转移指令实现段间转移
这是在debug中使用的汇编指令,汇编编译器并不认识
如果在源程序中使用,编译器也会报错。