引言
8086CPU的转移指令分为以下几类:
无条件转移指令 (如:jmp)
条件转移指令
循环指令(如:loop)
过程
中断
9.1 操作符offset
操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
9.2 jmp指令
jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP。
9.3 依据位移进行转移的jmp指令
jmp short 标号(转到标号处执行指令)这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时最多越过128个字节,向后转移最多越过127个字节。
CPU 在执行EB 03(EB为jmp short的机器码)的时候,并不知道转移目的地址。
jmp short s指令的读取和执行过程:
1.(CS)=0BBDH,(IP)=0006,CS:IP指向EB 03(jmp short s的机器码);
2.读取指令码EB 03进入指令缓冲器;
3.(IP)=(IP)+所读取指令的长度=(IP)+2=0008,CS:IP指向add ax,1;
4.CPU指行指令缓冲器中的指令EB 03;
5.指令EB 03执行后,(IP)=000BH,CS:IP指向inc ax。
指令“jmp near ptr 标号”的说明:
1.16位位移=“标号”处的地址-jmp指令后的第一个字节的地址;
2.near ptr指明此处的位移为16位位移,进行的是段内近转移;
3.16位位移的范围为-32769~32767,用补码表示;
4.16位位移由编译程序在编译时算出。
9.4 转移的目的地址在指令中的jmp指令
jmp short(near)指令,其对应的机器码中并没有转移的目的地址,而是相对于当前IP的转移位移。
指令 “jmp far ptr 标号” 实现的是段间转移,又称为远转移:
1.(CS)=标号所在段的段地址;
2.(IP)=标号所在段中的偏移地址。
3.far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。
9.5 转移地址在寄存器中的jmp指令
jmp 16位寄存器功能:IP =(16位寄存器)。
9.6 转移地址在内存中的jmp指令
jmp dword ptr 内存单元地址(段间转移)功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
9.7 jcxz指令
jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。
jcxz 标号 指令操作:当(cx)=0时,(IP)=(IP)+8位位移)。
我们从 jcxz的功能中可以看出,指令“jcxz 标号”的功能相当于:if((cx)==0) jmp short 标号;。
9.8 loop指令
9.9 根据位移进行转移的意义
jmp short 标号、jmp near ptr 标号、jcxz 标号、loop 标号等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。不包含转移的目的地址,而包含的是到目的地址的位移距离。方便了程序段在内存中的浮动装配。
9.10 编译器对转移位移超界的检测
根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。
参考资料:《小甲鱼汇编零基础入门》
《汇编语言》第三版