8086cpu的转移指令分为以下几类:
-无条件跳转指令
-条件跳转指令
-循环指令
-过程
-中断
offset操作符
offset是伪指令,它的功能是取得标号的偏移地址。
assume cs:code
code segment
start:mov ax,offset start ;相当于mov ax,0
s:mov ax,offset s ;相当于mov ax,3
code ends
end start
jmp指令
jmp指令为无条件转移,可以只修改ip,也可以同时修改CS和IP。
jmp指令要给出的两种信息:
-转移的目的地址;
-转移的距离(段间转移、段内短转移、段内近转移);
段内短转移:jmp short 标号
转到标号处执行指令,可以进行8位位移,它对ip的修改范围为-128~127。
assume cs:code
code segment
start:mov ax,0
jmp short s ;直接跳到标号s处执行
add ax,1
s:inc ax
code ends
end start
执行jmp short指令后,会将ip加上当前ip地址与跳转目标地址的偏移量。
段内近转移:jmp near ptr 标号
与短转移功能相近,可以进行16位位移,它的位移范围为-32769~32767。
段间转移(远转移):jmp far ptr 标号
可以在段与段之间跳转,会将标号的cs、ip转移到当前cs、ip中。
转移地址在寄存器中的jmp指令:jmp 16位寄存器
,可以将寄存器中的值转移到当前ip中。
转移地址在内存中的jmp指令:
-
jmp word ptr 内存单元地址
(段内转移)
目标内存单元出存放着一个字,是转移的目的偏移地址。 -
jmp dword ptr 内存单元地址
(段间转移)
目标内存单元处存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
cs=内存单元地址+2
ip=内存单元地址
jcxz指令
jcxz指令为有条件跳转指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,对ip的修改范围为-128~127。
格式:jcxz 标号
,表示如果cx为0,则转移到标号处执行。
相当于:
if(cx==0)
jmp short 标号;
loop指令
loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含位移,而不是目的地址。
格式:loop 标号
执行:cx=cx-1,如果cx!=0,转移到标号处执行。
根据位移进行转移的意义
jmp short 标号
jmp near ptr 标号
jcxz 标号
loop 标号
这几种指令对ip的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包括转移的目的地址,而包含的是到目的地址的位移距离。
这样涉及,方便了程序段在内存中的浮动装配。
如果给出具体地址,则程序运行时需要在固定的内存地址,否则会出错。而使用偏移地址则不会出现这样的情况。