有效地址EA
- 8086中把操作数的偏移地址称为有效地址(EA)
EA = 基址 + (变址*比例因子) + 位移量
四种成分 | 16位寻址 | 32位寻址 |
---|---|---|
位移量 | 0、8、16位 | 0、8、16、32位 |
基址寄存器 | BX,BP | 任何32位通用寄存器(包括ESP) |
变址寄存器 | SI,Di | 除ESP以外的32位通用寄存器 |
比例因子 | 无 | 1、2、4、8 |
- 比例因子为固定值,其他三个成分都可正可负,以保证指针移动的灵活性
- 比例因子:386及后续机型新增的寻址方式中的一个术语,其值可以为1、2、4、8。
与数据有关的寻址方式
- 以MOV指令为例
- 立即寻址:MOV AX,3069H
- 寄存器寻址:MOV AL,BH
- 直接寻址:MOV AX,[2000H]
- 寄存器间接寻址:MOV AX,[BX]
- 寄存器相对寻址:MOV AX,COUNT[SI]
- 基址变址寻址:MOV AX,[BP][DI]
- 相对基址变址寻址:MOV AX,MASK[BX][SI]
立即数寻址
如:MOV AX, 3069H
- 操作数作为指令的一部分直接写在指令中,这种操作数成为立即数,这种寻址方式也成为立即数寻址方式
- 特点:操作数存放在存储器中,指令的下一单元即为立即操作数n。
寄存器寻址
如:MOV AL, BH
- 指令中要用到的操作数已经存储在某寄存器中,或把目标操作数存入某寄存器。把指令中指出所使用寄存器(即寄存器的助记符)的寻址方式成为寄存器寻址
- 特点:操作数直接存放在寄存器中,速度较快
直接寻址
如:MOV AX, [2000H]
- EA = 操作数
- 指令所要的操作数存放在内存中,指令中直接给出该操作数的有效地址
- 特点:操作数的有效地址只包含位移量一种成分
- 直接寻址的地址要写在”[]”内
寄存器间接寻址
如:MOV AX, [BX]
- EA = BX
- 操作数在存储器中,操作数的有效地址使用SI、DI、BX和BP等四个寄存器之一来指定
- 特点:有效地址在寄存器中,操作数在存储器中
寄存器相对寻址
如:MOV AX,COUNT[SI] (也可表示为 MOV AX, [COUNT+SI])
- EA = COUNT + SI
- 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和
- 特点:有效地址由两种成分组成
基址变址 寻址
如:MOV AX,[BP][SI](或MOV AX,[BP+SI])
- EA = BP+SI
- 操作数存储在存储器中,其地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和
- 处理数组和表格,首地址放在基址寄存器(BX,BP),而用变址寄存器(SI,DI)来访问数组的各个元素
相对基址变址寻址
如:MOV AX,MASK[BX][SI]
- EA = MASK+BX+SI
- 操作数存放于存储器中,其有效地址是由一个基址寄存器(BX、BP)、一个变址寄存器(SI、DI)和指令中的8位/16位偏移量之和
- 通常用于二维数组的寻址