首页 理论教育 微型计算机原理:转移地址相关的寻址方式

微型计算机原理:转移地址相关的寻址方式

时间:2023-11-03 理论教育 版权反馈
【摘要】:在上一小节中,我们介绍了与数据访问相关的7种寻址方式,这些寻址方式确定的是数据访问的地址,本节我们将介绍与转移地址相关的寻址方式,用来在转移发生时确定将转移到目标指令的地址。当程序在顺序执行的时候,下一条指令的地址是由指令指针IP自动增量而产生的,当诸如JMP、CALL、JE这类转移控制类指令被执行时,与转移地址相关的寻址方式就被用来提供转移到目标地址。不同的转移寻址方式,修改CS和IP值的方式是不一样的。

微型计算机原理:转移地址相关的寻址方式

在上一小节中,我们介绍了与数据访问相关的7种寻址方式,这些寻址方式确定的是数据访问的地址,本节我们将介绍与转移地址相关的寻址方式,用来在转移发生时确定将转移到目标指令的地址。当程序在顺序执行的时候,下一条指令的地址是由指令指针IP自动增量而产生的,当诸如JMP、CALL、JE这类转移控制类指令被执行时,与转移地址相关的寻址方式就被用来提供转移到目标地址。这些寻址方式是:段内直接寻址,段间直接寻址,段内间接寻址,段间间接寻址。

在与转移地址相关的寻址时,有3个用来表示转移距离的操作符经常被使用,它们是用来表示位移量在-128~+127之间的SHORT,用来表示位移量在-32768~+32767之间的NEAR和表示位移量超过-32768~+32767或跨越不同段转移的FAR。由于CS:IP寄存器总是指向下一条要被执行的指令的首地址,所以转移指令的执行必然包括对IP或CS:IP的值的修改。在3种转移中,SHORT转移称为短转移,位移量用一个字节(8位)表示。NEAR转移称为近转移,位移量用一个字(16位)来表示。由于短转移和近转移的程序控制仍然在当前代码段,所以只有IP的值会被修改,而CS的值保持不变。FAR转移称为远转移,程序控制超出了当前代码段,所以CS和IP的值都要修改为新的值。不同的转移寻址方式,修改CS和IP值的方式是不一样的。和设置操作数类型属性相仿,转移目标地址的类型属性(NEAR和FAR)可以通过类型操作符PTR来设置,例如:

JMP FAR PTR LABEL

1.段内直接寻址

段内直接寻址方式在指令中直接指出转向的目标地址,而且目标地址和当前指令指针在同一个段内。段内直接寻址的格式为:

JMP SHORT LOOP

JMP NEAR PTR AGAIN

其中,LOOP和AGAIN都是转移目标的符号地址,并与当前指令指针在同一个段内,所以段内直接寻址的转移类型只能是SHORT或NEAR。在机器指令中,操作码之后给出的是以有符号数形式表达的相对于当前IP值的位移量(转移距离),转移的有效地址(目标地址)是当前IP值与指令给出的位移量之和。需要注意的是,指令指针IP指向的是即将被执行的下一条指令,也就是说,当前IP值应当是即将被执行的下一条指令的首地址,而不是当前被执行的转移指令的首地址。例如下面的程序段:

在这个指令片段里,JMP SHORT LOOPA这条指令的操作数是字节常量F9,即补码形式的-7,在这条指令执行的时候,指令指针应当指向其下一条指令(即MOV AX,0)的首地址,即000D,转移时将000D加上F9(即-7),得到0006,即为转移的目标地址,也就是LOOPA标号对应的地址并装入IP,程序将从该地址起继续执行,这样就实现了程序的转移。

2.段间直接寻址

和段内直接寻址方式相似,段间直接寻址在指令中直接指出转向的目标地址,不同的是目标地址和当前指令指针在不同段内,需要在转移目标符号地址之前加上用来表示远转移的类型操作符FAR。段间直接寻址的格式为:

JMP FAR PTR OUTPUT

由于转移发生在不同的代码段之间,所以在转移过程中CS和IP的值都要被修改,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的目标偏移地址装入IP,目标段地址装入CS,就完成了这个段间转移。需要注意的是,和段内直接寻址将当前IP值与指令中提供的位移量之和装入IP寄存器不同,段间直接寻址时装入IP寄存器的是指令中提供的目标偏移地址,而与当前的IP值没有任何关系。

3.段内间接寻址

无论是段内直接寻址还是段间直接寻址,其寻址目标都是固定的,也就是说转移的目标地址是在程序编写的时候就已经确定了的,无法在程序运行的过程中予以更改,而这正是我们设计程序时经常需要的功能(比如转移表),这时我们就需要采用段内间接寻址方式来为转移指令提供目标地址。段内间接寻址在指令中用除立即寻址之外的数据寻址方式间接地指出转移的目标地址。例如:(www.xing528.com)

JMP BX

JMP NEAR PTR[BX]

JMP WORD PTR TABLE[BX]

JMP NEAR PTR INDEX[BX][SI]

上面这些指令都采用了段内间接寻址的方式来转移到目标地址。它们都通过对寄存器或存储器的访问,取得一个字的转移目标偏移地址,并将IP寄存器设为该地址以实现程序的转移。根据前面介绍过的各种对数据进行寻址的寻址方式规则,我们可以知道,这几条指令中第一条的转移目标地址为BX寄存器中的内容,第二条指令的转移目标为BX寄存器所指向的存储单元(即以BX寄存器内容为地址的存储单元)的内容,第三条指令的转移目标是[BX]+TA- BLE存储单元的内容,第四条指令的转移目标则是[BX]+[SI]+INDEX存储单元的内容。

使用段内间接寻址,我们可以非常简单地实现跳转表的功能。下面就是一个例子:

在这个例子中,我们定义了一个以TABLE为起始地址的跳转表,跳转表的内容是一系列实现特定功能的程序段的符号地址FUNC1、FUNC2、FUNC3……的值。在执行JMP指令的时候,先根据指令中的寄存器相对寻址方式计算出存放转移目标地址的存储器单元偏移地址为TABLE+[BX]=TABLE+2,然后取TABLE+2地址的内容为转移到的目标地址(就是FUNC2)。因此,JMP指令执行后,IP的值被赋为FUNC2,CS不变,程序将从FUNC2标号处继续执行。

4.段间间接寻址

段间间接寻址和段内间接寻址的寻址方式基本相同,都是通过指令中的数据寻址方式来取得转移到的目标地址。相比起来,由于段间间接寻址需要同时为CS和IP两个寄存器赋值,所以段间间接寻址所取得的目标地址应当是一个32位的双字。为了说明这一点,在指令中必须加上双字操作符DWORD。下面是几个段间间接寻址的例子:

JMP DWORD PTR[BX]

JMP DWORD PTR TABLE[BX]

JMP DWORD PTR INDEX[BX][SI]

需要注意的是,和段内间接寻址方式不同,段间间接寻址方式不能使用寄存器方式来寻址目标地址数据。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈