9 转移指令的原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fallfeather/article/details/82792738

1、可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令,8086CPU的转移行为有两种

(1)只修改IP时,称为段内转移,比如:jmp ax

(2)同时修改CS和IP时,称为段间转移,比如:jmp 1000:0

段内转移又分为

(1)短转移:IP的修改范围为-128~127

(2)近转移:IP的修改范围为-32768~32767

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

3、jmp指令

jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP

jmp指令要给出两种信息

(1)转移的目的地址

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

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

给下面一段程序:

assume cs:codesg

codesg segment

    start:mov ax,0

            mov bx,0

            jmp short s

            add ax,1

         s: inc ax

我们需要知道一个概念:CPU在执行jmp指令的时候并不需要转移的目的地址

为什么?

我们先简单回忆一下CPU执行指令的过程

(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

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

(3)执行指令。转到1,重复这个过程。

按照这个步骤,jmp short s指令的过程如下:

(1)(CS)= 0BBDH,(IP)=0006H,CS:IP指向EB 03(jmp short s 的机器码);

(2)读取指令码EB 03 进入指令缓冲器;

(3)(IP) = (IP)+ 所读取指令的长度 = (IP)+ 2 = 0008H,CS:IP指向add ax,1;

(4)CPU执行指令缓冲器中的指令EB 03;

(5)指令EB 03执行后,(IP) = 000BH,CS:IP指向inc ax

从上面的过程中我们看到,CPU将指令EB 03 读入后,IP指向了下一条指令,接着执行EB 03 如果没有对IP进行修改的话,那么,接下来CPU将执行add ax,1,可是,CPU执行的EB 03却是一条修改IP的转移指令,执行后CS:IP指向inc ax ,CS:0008处的add ax,1没有被执行

在转移指令EB 03中并没有告诉CPU要转移的目的地址,却告诉了CPU要转移的位移

实际上  ,“jmp short 符号”的功能为:(IP) = (IP)+8位位移

“jmp near ptr 标号”的功能为:(IP) = (IP)+16位位移

5、转移的目的地址在指令中的jmp指令

“jmp far ptr 标号”实现的是段间转移,又称远转移

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

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

指令格式:jmp 16位 reg

功能: (IP) = 16位reg

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

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

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

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

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

8、jcxz指令

jcxz指令为有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127

操作:当(cx)=0时,(IP)

jcxz的功能相当于C语言中的:

if((cx )== 0)  jmp short 标号;

9、loo[指令

loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为:-128~127

操作:

(1)(cx)= (cx)-1

(2)如果(cx)!=0,(IP) = (IP)+8位位移。

用C语言的语法表示为

(cx)--;

if((cx) != 0) jmp short 标号;

10、根据位移转移的意义

这种设计,方便了程序段在内存中的浮动装配

如果存的时地址,那么当装配地址发生改变时,固定地址后找不到要转移的地址会发生报错,如果依据位移进行转移,就不存在这个问题

11、编译器对转移位移超界的检测

根据位移进行转移的指令,他们的转移范围收到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器会报错

猜你喜欢

转载自blog.csdn.net/fallfeather/article/details/82792738
今日推荐