修改IP,或同时修改CSIP的指令统称转移指令

 

8086CPU的转移可以分为:

段内转移:只修改IP,如jmp
ax

段间转移:同时修改CSIP,如  jmp 1000:0

 

段内转移又可分为:

短转移:-128127(IP的修改范围)

近转移:-3276832767

 

8086CPU的转移指令:

无条件转移指令

条件转移指令

循环指令

过程

中断

 

 

 

 

操作符offset

 

格式:offset 变量/标号

功能:取得变量或标号的偏移地址

例如:

assume cs:codesg

codesg segment

start:mov ax,offset start

s:mov ax,offset s

codesg ends

end start

 

依据位移进行转移的jmp指令

 

CPU在执行jmp指令的时候并不需要转移的目的地址,而是通过翻译出的机器码中的指令码表示位移进行转移.

 

 

 

 

 

 

段内直接近转移

 

格式:jmp near ptr 标号

功能: (IP)=(IP)+16位位移

说明

1)     16位位移=“标号处地址-jmp指令后的第一个字节的地址

2)     near ptr指明此处的位移为16位位移,进行的是段内近转移

3)     可以转移到段内的任何一个位置

4)     16位位移的的范围为-32768~32767,用补码表示

5)     16位位移由编译程序在编译时算出

 

 

段内直接短转移

 

格式:jmp short 标号

功能:进行段内的短转移,转移到标号所在的目的地。(IP)=(IP)+8位位移

说明

1)     8位位移=“标号处地址-jmp指令后的第一个字节的地址

2)     short指明此处的位移为8位位移

3)     8位位移的范围是-128~127,补码表示

4)     8位位移由编译程序在编译时算出

 

段间直接远转移

 

格式:jmp far ptr 标号

功能:(CS)=标号所在段的段地址 (IP)=标号所在段的偏移地址

 

 

段间间接转移

 

格式:jmp dword ptr 内存单元地址

功能:从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址

(CS)=(内存单元地址+2)

(IP)=(内存单元地址)

 

例如:

mov ax,0123H

mov ds:[0],ax

mov word ptr ds:[2],0

jmp dword ptr ds:[0]

 

 

 

段内间接转移

 

格式:

jmp 16位寄存器

jmp word ptr 内存单元地址

功能:用16位寄存器或者16位的内存单元内容修改IP的值

例如:

mov ax,0123H

mov ds:[0],ax

jmp word ptr ds:[0]

 

jcxz指令

 

jcxz指令为有条件转移指令,所有有条件转移指令都是短转移

相当于   if((cx)==0)  jmp short 标号

 

格式:jcxz 标号

功能:若(cx)=0,转到标号处执行,否则执行下一条指令

操作:当(cx)=0,(IP)=(IP)+8位位移

1)     8位位移=“标号处地址-jcxz指令后的第一个字节的地址

2)     8位位移的范围是-128~127,补码表示

3)     8位位移由编译程序在编译时算出

loop指令

 

也是一种条件转移指令,所有的循环指令都是短转移

功能相当于:  (cx–); if ((cx)! = 0 )   jmp short 标号

 

格式:loop 标号

操作:(cx)=(cx)-1

(cx) ≠0,(IP)=(IP)+8位位移

1)     8位位移=“标号处地址-loop指令后的第一个字节的地址

2)     8位位移的范围是-128~127,补码表示

3)     8位位移由编译程序在编译时算出

 

根据位移进行转移的意义

 

jmp short 标号

jmp near ptr 标号

jcxz 标号

loop 标号

上述指令对IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的,其对应机器码中不包含转移的目的地址,而包含的是转移到目的的位移

优点:方便程序段在内存中的浮动装配

打赏