32 位 8 个:EBP,ESP(访问堆栈段),EAX~EDX,ESI,EDI(数据段)
例如:P。36 中部
4. 变址寻址
有两种格式:
有比例因子的变址寻址:存储单元的有效地址=比例因子*变址寄存器+位移量
指令格式: 段寄存器:[比例因子*变址寄存器+位移量]
或 段寄存器:位移量[比例因子*变址寄存器]
比例因子——是1,2,4,8中的一个数,用于检索一维数组。
可作为变址寄存器的是
32 位7个:EBP(访问堆栈段),EAX~EDX,ESI,EDI(访问数据段)。
没有比例因子的变址寻址:存储单元的有效地址=变址寄存器+位移量
指令格式: 段寄存器:[变址寄存器+位移量]
或 段寄存器:位移量[变址寄存器]
变址寄存器只能选择 SI,DI,约定访问数据段。
例如: MOV AL,[2*EBX+10] ;从数据段有效地址为 2*EBX+10 单元取数—>AL
MOV AH,[SI+5] ;
5. 基址加变址寻址
有比例因子的基址加变址寻址:
存储单元的有效地址=基址寄存器+比例因子*变址寄存器+位移量
指令格式: 段寄存器:[基址寄存器+比例因子*变址寄存器+位移量
]
或 段寄存器:位移量[基址寄存器+比例因子*变址寄存器]
或 段寄存器:位移量[基址寄存器][比例因子*变址寄存器
]
寄存器必须是32位的。访问约定的逻辑段,段超越前缀可省略。
常用于检索二维数组。
例: MOV AX,[EBX+8*EDX+5]
没有比例因子的基址家变址寻址:
存储单元的有效地址=基址寄存器+变址寄存器+位移量
指令格式: 段寄存器:[基址寄存器+变址寄存器+位移量]
或 段寄存器:位移量[基址寄存器+变址寄存器]
或 段寄存器:位移量[基址寄存器][变址寄存器]
寄存器必须是规定的16位寄存器。访问约定的逻辑段,段超越前缀可省略。
例: DATA1 DB 10HDUP(?) ;定义 16 个字节的缓冲区
DATA2 DB 11H,22H,33H,44H,55H,66H
······
MOV BX,OFFSET DATA1 ;设 BX=0100H
MOV DI,11H
MOV AL,[BX+DI+4] ;EA=0100H+011H+4=0115H,AL=66H
注意:
在间址、基址、变址、基址加变址这4种寻址方式中,可使用 16 位,也可使用
32 位寄存器寻址。
实模式时,段的最大长度为 64K,所以必须保证 CPU 最终算出的有效地址不超过
FFFFH,而且操作数最高字节单元的有效地址也不能超过 FFFFH,否则执行寻址
时系统将要瘫痪。例如:P。37
4.2.4 80486 寻址方式的段约定和段超越
存储器寻址时规定使用的寄存器和约定访问的逻辑段。见表 4。2
如果要访问约定访问之外的逻辑段,必须明确指出相关逻辑段的段超越前缀。例:
MOV AL,[BP] ;用 BP 间址,访问堆栈段
MOV AL,DS:[BP] ;用 BP 间址,访问数据段
MOV AL,FS:[BP] ;用 BP 间址,访问 FS 附加段
MOV AL,[BX] ;用 BX 间址,访问数据段