可以修改IP,或同时修改CS和IP的指令统称为转移指令
8086转移行为分为:
只修改IP,称为段内转移,如:jmp ax
同时修改CS和IP,称为段间转移,如jmp 1000:0
根据转移指令对IP的不同修改范围,段内转移分为:
短转移:IP修改范围为-128~127
近转移:IP修改范围为-32768~32767
8086的转移指令分为:
无条件转移指令(如jmp)
条件转移指令
循环指令(如loop)
过程
中断
1.操作符offset
offset是由编译器处理的符号,功能是取得标号处的偏移地址
2.jmp指令
jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP
jmp指令要给出两种信息:
转移的目的地址
转移的距离(段间转移、段内短转移、段内近转移)
3.根据位移进行转移的jmp指令
jmp short 标号(转到标号处执行指令)
向前转移时最多越过128个字节,向后转移时最多越过127个字节,转移结束后,CS:IP指向标号处指令
一般的汇编指令,idata不论它是一个数据还是内存单元的偏移地址,都会在对应的机器指令中出现。
debug将jmp short s中的s表示为inc ax指令的偏移地址8,jmp short s表示为jmp 0008,表示转到CS:0008处
但机器码中却不包含0008
cpu在执行jmp指令时不需要转移的目标地址
EB 03没告诉cpu目标地址,却告诉了cpu要转移的位移,即令IP向后移动三个字节
实际上“jmp short 标号”的功能是:(IP)=(IP)+8位位移
①8位位移=标号处的地址-jmp指令后的第一个字节的地址
②short指明此处的位移为8位位移,补码表示
③8位位移的范围为-127~128
④8位位移由编译程序在编译时算出
与jmp short类似,“jmp near ptr 标号”实现段内近转移,功能为(IP)=(IP)+16位位移
①16位位移=标号处的地址-jmp指令后的第一个字节的地址
②near ptr指明此处的位移为16位位移,进行的是段内近转移
③16位位移的范围为-32768~32767,用补码表示
16位位移由编译程序在编译时算出
4.转移的目的地址在指令中的jmp指令
jmp far prt 标号,实现段间转移,又称为远转移
(CS)=标号所在段的段地址
(IP)=标号在段中的偏移地址
far ptr指明了用标号的段地址和偏移地址修改CS和IP
jmp far ptr s对应EA 0B 01 BD 0B,其中包含目的地址“0B 01 BD 0B”
高地址BD 0B是段地址0BBDH,低地址0B 01是偏移地址010BH
5.转移地址在寄存器中的jmp指令
jmp 16位reg
功能(IP)=(16位reg)
6.转移地址在内存中的jmp指令
①jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放一个字,是转移的目的偏移地址
内存单元地址可用寻址方式的任一格式给出
②jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放两个字,高地址的字是转移的目的段地址,低地址是转移的目的偏移地址
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
7.jcxz指令
jcxz:有条件转移指令
所有有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址
格式:jcxz 标号
如果(cx)=0 转移到标号处执行
(cx)=0时,(IP)=(IP)+8位位移
(cx)!=0时,什么也不做
相当于if((cx)==0)jmp short 标号
8.loop指令
所有循环指令都是短转移
9.根据位移进行转移的意义
10.编译器对转移位移超界的检测