寻址方式(addressing mode)是指令取得操作数地址所使用的方式,与数据有关的寻址方式通过确定操作数地址来找到操作数。以下方式以MOV指令为例。
非存储器寻址
MOV AX, 1234H
MOV指令将目标操作数(第二个操作数)1234H赋值给源操作数(第一个操作数),即赋值给AX寄存器。此时3064H这个数被称为立即数,它是指令的一个组成部分,与指令存放在一起,即存放在代码段中。这是立即寻址方式(immediate addressing)。
MOV AX, BX
此时MOV指令将BX寄存器中的值赋给AX寄存器,即若(BX)=1234H,则执行指令后(AX)=1234H,(BX)保持不变。此时寻址的操作数存放在BX寄存器中。这是寄存器寻址方式(register addressing)。
以上两种寻址方式,操作数都存储在代码段和寄存器内,不需要访问除代码段的存储器。
存储器中的操作数
MOV AX, [1234H]
MOV AX, [BX]
这里的方括号可以理解为访问存储器,方括号括起来的东西(数或寄存器)是这个操作数在存储器中的地址,[1234H]取得的是存储器的数据段中1234H位置所存储的数。若这个位置存储的是2000H,则执行第一条MOV后(AX)=2000H,这是直接寻址方式(direct addressing)。
[BX]同理,若(BX)=1234H,则[BX]相当于[1234H],BX被称为基址寄存器。这是寄存器间接寻址方式(register indirect addressing),两种寻址方式与上一节中的两种对应。
注意这里的1234H是2000H实际存放位置的位移量,即标识了2000H在数据段(即此时默认的段)中的相对位置,相对位置被称为有效地址,而不是实际存放的物理地址。实模式中,物理地址 = 段起点地址 + 位移量,数据段的起点地址存储在数据段寄存器DS中,DS由于是默认的寄存器所以在指令中省略了,也就是第一个指令也相当于:
MOV AX, DS:[1234H]
这时若DS标示的段起始地址为20000H,则2000H实际存放的物理地址在20000H + 1234H = 21234H处。
若需要跨段访问数据,也可修改使用的段寄存器。
变址寄存器
MOV AX, 1000H[SI]
MOV AX, [BX][SI]
这里除了由数表示的位移量和基址寄存器BX标示的基址之外,出现了变址寄存器SI。此时有效地址为原来的地址加上SI中保存的地址,所以这两个指令也可以写为:
MOV AX, [1000H+SI]
MOV AX, [BX+SI]
位移量加上变址为寄存器相对寻址方式(register relative addressing),基址加上变址为基址变址寻址方式(based indexed addressing)。
基址、变址和位移量可以也同时使用:
MOV AX, 1000H[BX][SI]
有效地址为三者之和,此为相对基址变址寻址方式(relative based indexed addressing)。
比例因子
比例因子出现在80386和后续机型中,它的值只能是1,2,4或者8,所以包含比例因子的寻址方式不能用在8086/80286中。比例因子用于对变址寄存器的内容进行运算,变址的值等于比例因子乘以变址寄存器的内容。
MOV AX, 1000H[SI*2]
MOV AX, [BX][SI*4]
MOV AX, 1000H[BX][SI*8]
例如第一条指令中,若(SI)=1234H,则赋给AX的操作数所在的有效地址为1000H + 1234H*2 = 1000H + 2468H = 3468H。
这三种寻址方法和上一节中的三种对应,分别为比例变址寻址方式(scaled indexed addressing)、基址比例变址寻址方式(based scaled indexed addressing)和相对基址比例变址寻址方式(relative based scaled indexed addressing)。
总结
对于操作数存放在代码段外的存储器时的寻址方式,MOV指令的源操作数给出的都是寻址操作数的有效地址。
有效地址 = 基址寄存器存放的基址 +(变址寄存器存放的变址 × 比例因子)+ 位移量
物理地址 = 段寄存器标示的段起始地址 + 有效地址
10种寻址方式的总结:
MOV AX, 1000H ;立即寻址方式(immediate addressing)
MOV AX, BX ;寄存器寻址方式(register addressing)
MOV AX, [1000H] ;直接寻址方式(direct addressing)
MOV AX, [BX] ;寄存器间接寻址方式(register indirect addressing)
MOV AX, 1000H[SI] ;寄存器相对寻址方式(register relative addressing)
MOV AX, [BX][SI] ;基址变址寻址方式(based indexed addressing)
MOV AX, 1000H[BX][SI] ;相对基址变址寻址方式(relative based indexed addressing)
MOV AX, 1000H[SI*2] ;比例变址寻址方式(scaled indexed addressing)
MOV AX, [BX][SI*4] ;基址比例变址寻址方式(based scaled indexed addressing)
MOV AX, 1000H[BX][SI*8] ;相对基址比例变址寻址方式(relative based scaled indexed addressing)