【汇编】数据存储器寻址方式
【汇编】数据寄存器寻址方式
1. 立即寻址方式
属于“操作数就包含在指令中”的情况。
立即寻址方式只能出现在源操作数中。
MOV AL, 06H ;指令代码:B0 06
MOV EBX, 100 ;指令代码:66BB 64000000
两条指令的操作码B0 66BB,源操作数分别为06 64000000。
2. 寄存器寻址方式
属于“操作数在CPU的某个寄存器中”的情况。
MOV AL, 06H ;指令中目标操作数AL就是寄存器寻址方式
MOV DS, AX ;指令中两个操作数DS和AX都是寄存器寻址方式
下面的3~8寻址方式均为存储器(内存)寻址方式。
属于“操作数在内存中"的情况。
3. 直接寻址方式
在指令中直接给出参加操作数的偏移地址,也就是外套了个[]。
MOV AX, [2000H] ;功能:AX⬅(DS:2000H) 指令代码:A1 0020
MOV [2000H], AX ;功能:DS:2000H⬅(AX) 指令代码:A3 0020
实际应用中,人们并不关心具体的存储地址,只需要申请一个存储单元。所以直接定义变量,而无须定义具体的地址值。
...
.data
x db 10
y db 4
.code
...
MOV AL, x
SUB AL, y
...
源操作数x和y都是直接寻址,因为指令对x和y的调用都是调用操作数的偏移地址。
4. 寄存器间接寻址
参加操作数据的偏移地址用ESP之外的其他寄存器指定,这种寻址方式称为寄存器间接寻址方式。
在不指定段的情况下,有下列规定:
(1)若偏移地址用EBP来指定,则其默认的段寄存器为SS;
(2)若偏移地址用EBP之外的其他寄存器来指定,则其默认的段寄存器为DS。
值得注意的是,实模式中,用32位寄存器寻址存储器时,32位寄存器的内容不允许超过0000FFFFH,因为实模式下的段不能超过64KB。
例如:
MOV AL, [ESI]
该指令用于将DS段中的偏移量为ESI的内存单元内容传给AL。
MOV AL, [EBP]
该指令用于将SS段中的偏移量为EBP的内存单元内容传送给AL。
5. 相对寄存器寻址方式
参加操作数据的偏移地址是用位移量加指令中指定的寄存器内容。
段寄存器的规定同寄存器间接寻址。
MOV AL,count[ESI]
等价描述:
MOV AL,[ESI]count
MOV AL,[ESI + count]
该指令的功能是将DS段中的偏移量为ESI+count的内存单元内容传给AL。
主要用于一维数组的操作。
6. 基址加变址寻址方式
这里容易错,因为有几个语法规则。
在16位微处理器中,参加操作数据的偏移地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。
在不指定段的情况下,规定:
- 如果有效地址中含有BP,则默认的段寄存器为SS;
- 否则,默认的段寄存器为DS。
在IA-32微处理器中,这种寻址方式允许除了ESP以外的任意两个R32都可以组合使用,段寄存器的默认情况同寄存器间接寻址。例如:
MOV AX,[EBP][ ESI]
该指令的功能是将SS段中偏移量为(EBP+ESI)的内存单元内容传给AL,(EBP+ESI+1)的内存段元的内容传给AH。
7. 相对基址加变址寻址方式
相对基址加变址寻址方式类似于基址加变址寻址方式,但是它用基址寄存器和变址寄存器加位移量形成操作数的偏移地址。
相对于基址加变址寻址多加了掩码mask。
这种寻址方式通常用来寻址二维数组数据。(相对寄存器寻址是一维)
MOV AX, mask[EBX][ESI]
该指令的功能是将DS段中偏移量为(EBX+ESI+ mask)的内存单元内容传给AL,(EBX+ESI+mask+1)的内存单元的内容传给AH。
操作数的段地址是由选择的基址寄存器决定的。
这种寻址方式主要用于二维表格操作。
8. 比例变址寻址方式
IA-32微处理器特有。
比例变址寻址使用除了ESP以外的任意一个R32或两个R32组合寻址偏移地址。
其中一个寄存器可与比例因子相乘。
比例因子可以是1,2,4,8。比例因子2用来寻址字数组,比例因子4用来寻址双字数组,而比例因子8用来寻址四字数组。
MOV EAX,[EBX + ECX*4]
MOV [EAX + EDI*2 + 100H], ECX
MOV EAX,ARRAY[ECX*4]
练习
设DS=6000H,ES=2000H,SS=1500H,SI=00A0H,BX=0800H,BP=1200H,字符常数VAR为0050H。
说明以下各条指令源操作数的寻址方式及存储器操作数的物理地址。
MOV AX, BX ;寄存器寻址
MOV DL, 80H ;立即寻址
MOV AX, VAR[BX][SI] ;相对基址加变址寻址 物理地址=DS*10H + (BX+SI+VAR)=60000H + (0800H+00A0H+0050H)=608F0H
MOV AL, ‘B’ ;立即寻址
MOV DI, ES:[BX] ;寄存器间接寻址 物理地址=ES*10H + BX=20000H + 0800H=20800H
MOV DX, [BP] ;寄存器间接寻址 物理地址=SS*10H + BP=15000H + 1200H=16200H
MOV BX, 20H[BX] ;寄存器间接寻址 物理地址=DS*10H + (BX+20H)=60000H + (0800H+0020H)=60820H
注:
这里寄存器寻址方式在某些科目是不一样的。
比如说计组里有偏移寻址(相对寻址、基址寻址和变址寻址)等等,相对寄存器寻址在计组叫寄存器相对寻址。
这里主要讲微机原理与接口技术这门课里提到的8个寻址方式。

浙公网安备 33010602011771号