汇编语言||关于单片机数据的寻址方式总结
补充寄存器相关类型:
1)数据寄存器
- AX:累加器。多用于存放中间运算结果。所有I/O指令必须都通过AX与接口传送信息;
- BX:基址寄存器。在间接寻址中用于存放基地址;
- CX:计数寄存器。用于在循环或串操作指令中存放循环次数或重复次数;
- DX:数据寄存器。在32位乘除法运算时,存放高16位数;在间接寻址的I/O指令中存放I/O端口地址。
2)指针和变址寄存器
- SP:堆栈指针寄存器,其内容为栈顶的偏移地址;
- BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。
- SI:源变址寄存器
- DI:目标变址寄存器
变址寄存器常用于指令的间接寻址或变址寻址。
3)段寄存器
- CS:代码段寄存器,代码段用于存放指令代码
- DS:数据段寄存器
- ES:附加段寄存器,数据段和附加段用来存放操作数
- SS:堆栈段寄存器,堆栈段用于存放返回地址,保存寄存器内容,传递参数
数据寻址方式
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之一) |
寄存器相对 | 一个寄存器加上位移量 |
基址—变址 | 两个不同类别的寄存器 |
相对基址-变址 | 两个不同类别的寄存器加上位移量 |