操作数的寻址方式
微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。
另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式——32位地址的寻址方式。
1.立即寻址方式
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
2.寄存器寻址方式
指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
、8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
、16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
、32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
3.直接寻址方式
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。
试比较下列指令中源操作数的寻址方式(VARW是内存字变量):
MOV AX, 1234H | MOV AX, [1234H] | ;前者是立即寻址,后者是直接寻址 | |
MOV AX, VARW | MOV AX, [VARW] | ;两者是等效的,均为直接寻址 |
4.寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。 |
在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
5.寄存器相对寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。
|
|
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
6.基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的计算公式如右式所示。 |
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
7.相对基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。比如: |
|
用D1[i]来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[i][j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址方式的灵活度也就相应提高了。
相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。
MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX]
但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。
相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。表3.1列举出该寻址方式与其它寻址方式之间的变形关系。
表3.1 相对基址加变址寻址方式与其它寻址方式之间的变形关系
源操作数 | 指令的变形 | 源操作数的寻址方式 |
只有偏移量 | MOV AX, [100H] | 直接寻址方式 |
只有一个寄存器 | MOV AX, [BX] 或 MOV AX, [SI] | 寄存器间接寻址方式 |
有一个寄存器和偏移量 | MOV AX, [BX+100H] 或 MOV AX, [SI+100H] | 寄存器相对寻址方式 |
有二个寄存器 | MOV AX, [BX+SI] | 基址加变址寻址方式 |
有二个寄存器和偏移量 | MOV AX, [BX+SI+100H] | 相对基址加变址寻址方式 |
8.32位地址的寻址方式
在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。
当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。
32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
下面列举几个32位地址寻址指令:
由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下: 1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器; |
如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;
2、默认段寄存器的选用取决于基址寄存器;
3、基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;
4、在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。
下面列举几个32位地址寻址指令及其内存操作数的段寄存器。
指令的举例 | 访问内存单元所用的段寄存器 |
MOV AX, [123456H] | ;默认段寄存器DS |
MOV EAX, [EBX+EBP] | ;默认段寄存器DS |
MOV EBX, [EBP+EBX] | ;默认段寄存器SS |
MOV EBX, [EAX+100H] | ;默认段寄存器DS |
MOV EDX, ES:[EAX*4+200H] | ;显式段寄存器ES |
MOV [ESP+EDX*2], AX | ;默认段寄存器SS |
MOV EBX, GS:[EAX+EDX*2+300H] | ;显式段寄存器GS |
MOV AX, [ESP] | ;默认段寄存器SS |