第九章 转移指令的原理 其一

8086cpu的转移指令分为以下几类:

无条件转移指令(如:jmp)

条件转移指令

循环指令

过程

中断

9.1  操作符0ffset

操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址。

9.2  jmp指令

jmp为无条件转移,可以只修改ip,也可以同时修改cs和ip

jmp指令给出两种信息:

1.转移的目的地址

2.转移的距离(段间距离、段内段转移,段内近转移)

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

jmp  short  标号(转到标号处执行指令)

这种格式的jmp指令实现的是段内段转移,他对ip的修改范围为-128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。

我们先来复习一下CPU执行指令的过程:

1)从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲区。

2)(ip)=(ip)+所读取指令的长度,从而指向下一条指令。

3)在指令缓冲区执行指令。转到1,重复这个过程。

在jmp  short  指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。

这个位移,使编译器根据汇编指令中的标号计算出来的。

实际上,指令jmp  short标号的功能为ip=ip+8位位移。

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

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

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

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

还有一种和指令jmp  short  标号功能相近的指令格式:

jmp  near   ptr  标号

它实现的是段内近转移。

指令jmp  near  ptr  标号的功能为:

ip=ip+16;

指令jmp  near  ptr标号的说明:

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

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

3)16位转移的范围为:-32768~32767,用补码表示。

4)16位位移由编译器程序在编译时算出。

9.4转移的目的地址在指令中的jmp指令

前面讲的jmp指令,其对应的机器码中并没有转移的目的地址,而是相对于当前ip的转移位移。

指令jmp  far  ptr  标号

实现的是段间转移,又称为远转移。

指令jmp  far   ptr  标号功能如下:

cs=标号所在段的段地址

ip=标号所在段中的偏移地址

far  ptr  指明了指令用标号的段地址和偏移地址修改cs和ip

9.5  转移地址在寄存器中的jmp指令

指令格式:jmp16位寄存器

功能:ip=(16位寄存器)

 

9.6转移地址在内存中的jmp指令

转移地址在内存中的jmp指令有两种格式:

1)jmp  word  ptr 内存单元地址(段内转移)

功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

内存单元地址可用寻址方式的任一格式给出

示例:

mov  ax,0123h

mov ds:[0],ax

jmp  word ptr  ds:[0]

执行后,ip=0123h

mov ax,0123h

mov [bx],ax

jmp word ptr  [bx]

执行后,ip=0123h

转移地址在内存中的jmp指令的第二种格式:

2)jmp  dword  ptr   内存单元地址(段间转移)

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

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

ip=(内存单元地址)

示例:

mov ax,0123h

mov ds:[0],ax

mov word ptr  ds:[2],0

jmp dword ptr ds:[0]

执行后,

cs=0

ip=0123h

cs:ip指向0000:0123

mov  ax,0123h

mov [bx],ax

mov word ptr [bx+2],0

jmp dword ptr [bx]

执行后:

cs=0

ip=0123h

cs:ip指向0000:0123

猜你喜欢

转载自www.cnblogs.com/fate-/p/12942382.html
今日推荐