1)数据寄存器
2)指针和变址寄存器
变址寄存器常用于指令的间接寻址或变址寻址。
3)段寄存器
1.立即寻址:操作数(为一常数)直接由指令给出(此操作数称为立即数)
注:立即寻址只能用于源操作数
例:
MOV AX, 1C8FH
MOV BYTE PTR[2A00H], 8FH
错误例:
× MOV 2A00H,AX ; 错误!
指令操作例:
MOV AX,3102H; AX->3102H
执行后,(AH) = 31H,(AL) = 02H
2.寄存器寻址
(1)操作数放在某个寄存器中
(2)源操作数与目的操作数字长要相同
(3)寄存器寻址与段地址无关
例:
MOV AX, BX
MOV [3F00H], AX
MOV CL, AL
错误例:
× MOV AX,BL ; 字长不同
× MOV ES:AX,DX ; 寄存器与段无关
3.直接寻址
(1)指令中直接给出操作数的16位偏移地址,偏移地址也称为有效地址(EA, Effective Address)
(2)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀
(3)偏移地址也可用符号地址来表示,如ADDR、VAR
例:
MOV AX ,[2A00H]
MOV DX ,ES:[2A00H]
MOV SI,TABLE_PTR
4.间接寻址
(1)操作数的偏移地址(有效地址EA)放在寄存器中
(2)只有SI、DI、BX和BP可作间址寄存器
例:
MOV AX,[BX]
MOV CL,CS:[DI]
错误例 :
× MOV AX, [DX]
× MOV CL, [AX]
5.寄存器相对寻址
EA=间址寄存器的内容加上一个8/16位的位移量
例:
MOV AX, [BX+8]
MOV CX, TABLE[SI]
MOV AX, [BP]; 默认段寄存器为SS
指令操作示例:
MOV AX,DATA[BX]
若(DS)=6000H, (BX)=1000H, DATA=2A00H,(63A00H)=66H, (63A01H)=55H
则物理地址 = 60000H + 1000H + 2A00H = 63A00H
指令执行后:(AX)=5566H
6.基址变址寻址
若操作数的偏移地址:
由基址寄存器(BX或BP)给出 —— 基址寻址方式
由变址寄存器(SI或DI)给出 —— 变址寻址方式
由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。
EA=(BX)+(SI)或(DI);EA=(BP)+(SI)或(DI)
同一组内的寄存器不能同时出现。
注意:除了有段跨越前缀的情况外,当基址寄存器为BX时,操作数应该存放在数据段DS中,当基址寄存器为BP时,操作数应放在堆栈段SS中。
例:
MOV AX, [BX] [SI]
MOV AX, [BX+SI]
MOV AX, DS: [BP] [DI]
错误例:
× MOV AX, [BX] [BP]
× MOV AX, [DI] [SI]
指令操作例:MOV AX,[BX][SI]
假定:(DS)=8000H, (BX)=2000H, SI=1000H
则物理地址 = 80000H + 2000H + 1000H = 83000H
指令执行后: (AL)=[83000H]
(AH)=[83001H]
7.相对基址变址寻址
在基址-变址寻址的基础上再加上一个相对位移量
EA=(BX)+(SI)或(DI)+8位或16位位移量;
EA=(BP)+(SI)或(DI)+8位或16位位移量
指令操作例:
MOV AX,DATA[DI][BX]
若(DS)=8000H, (BX)=2000H, (DI)=1000H, DATA=200H
则指令执行后(AH)=[83021H], (AL)=[83020H]
寄存器间接、寄存器相对、基址变址、相对基址变址四种寻址方式的比较:
寻址方式 |
指令操作数形式 |
寄存器间接 | 只有一个寄存器(BX/BP/SI/DI之一) |
寄存器相对 | 一个寄存器加上位移量 |
基址—变址 | 两个不同类别的寄存器 |
相对基址-变址 | 两个不同类别的寄存器加上位移量 |