目录
一、转移指令
二、操作符offset
三、jmp指令——无条件转移指令
1.转移地址由标号给出
(1)段内转移(根据位移进行转移)
1)段内短转移
2)段内近转移
(2)段间转移
2.转移地址在寄存器中
3.转移地址在内存中
(1)段内转移
(2)段间转移
四、jxcz指令——有条件转移指令+短转移
五、loop指令——循环指令+短转移
六、根据位移进行转移的意义
七、编译器对转移位移超界的检测
转移指令:可以修改IP,或同时修改CS和IP的指令统称为转移指令。
分类:
(1)段内转移(只修改IP)
短转移 IP修改范围为-128到127
近转移 IP修改范围为-32768到32767
(2)段间转移(同时修改CS和IP)
8086CPU的转移指令的分类:
(1)无条件转移指令(如:jmp)
(2)条件转移指令
(3)循环指令
(4)过程
(5)中断
功能:取得标号的偏移地址
例: s: mov ax,offset s
jmp可以只修改IP,也可同时修改CS和IP
语法:jmp short 标号
对应的机器码中,包含转移的位移(位移为标号处的地址-jmp指令后的第一个字节的地址)
功能:(IP)=(IP)+8位位移
例:
start: mov ax,0
jmp short s
add ax,1
s: inc ax
jmp short s 对应的机器码是EB03,意味着位移为3,即跳到inc ax语句
语法:jmp near ptr 标号
功能:(IP)=(IP)+16位位移
语法:jmp far ptr 标号
功能:(CS)=标号所在段的段地址,(IP)=标号在段中的偏移地址
例:
start: mov ax,0
mov bx,0
jmp far ptr s
db 256 dup (0)
s: add ax,1
inc ax
jmp far ptr s 的机器码为 EA0801BD0B
转移的段地址为0BBDH,偏移地址为 010BH
语法:jmp 16位reg
功能:(IP)=(16位reg)
jmp word ptr 内存单元地址
功能:从内存单元地址处开始存放一个字,是转移的目的偏移地址
例:
mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]
执行后,(IP)=0123H
jmp dword ptr 内存单元地址
功能:从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
例:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
执行后,(CS)=0,(IP)=0123H
所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移
语法:jcxz 标号
操作:当(cx)=0时,(IP)=(IP)+8位位移
位移由编译程序在编译时算出,范围都为-128到127
所有的循环指令都是短转移,在对应的机器码中包含转移的位移
语法:loop 标号
操作:
(1)(cx)=(cx)-1
(2)若(cx)不等于0,(IP)=(IP)+8位位移
方便了程序段在内存中的浮动装配——程序装在内存中的不同位置都可正常执行
例:jmp short s,若IP向后移动超过127个字节,则编译器会报错。