【汇编】数据存储器寻址方式

【汇编】数据寄存器寻址方式

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个寻址方式。

posted @ 2025-10-11 20:07  AKgrid  阅读(0)  评论(0)    收藏  举报