寻址方式概述

一条指令包含操作码和操作数两部分,

1)操作码(指令助记符)指出该指令要进行的操作,

2)操作数指出该指令需要的操作数或操作数的地址。

操作数在计算机中的位置及存取方式表。

32位微处理器通用寄存器 32位微处理器指令系统之寻址方式(1)

操作数在计算机中的位置及存取

指令根据一定的方式,先找到存储操作数的空间地址,然后取出操作数进行运算。寻找操作数的方式称为寻址方式。

寻址方式:指令根据一定的方式,先找到存储操作数的空间地址,然后取出操作数进行运算。寻找操作数的方式称为寻址方式。

操作数地址由 段基址 和 段内偏移地址共同产生。

段基址由段基址寄存器提供,有CS、SS、DS、ES、FS和GS。

段内偏移地址也称为有效地址EA(effective address),

32位有效地址的公式是: EA = 基址 (变址*比例因子) 位移量

32位寻址方式时段寄存器、基址寄存器、变址寄存器、比例因子和位移量的关系:

32位微处理器通用寄存器 32位微处理器指令系统之寻址方式(2)

备注:

1.在表中,如果以EBP和ESP为基址寄存器,默认访问的是堆栈段,段寄存器是SS。

若以其他6个寄存器为基址寄存器,默认访问的是数据段,段寄存器是DS。

2.如果数据存放在内存的附加数据段 时,需使用段超越前缀“ES:”、“FS:”或“GS:”,才能访问到相应附加数据段中的数据。

3.在串操作时,源串默认的段寄存器是DS,目的串默认的段寄存器是ES。

4.数据存放在内存的堆栈段时,默认的段寄存器为SS。

5.比例因子只能是1、2、4、8。

6.位移量是8位或32位的带符号数,所谓带符号数是指补码表示的二进制数。

7.立即寻址时,段寄存器为CS,以IP(16位)或EIP(32位)为段内偏移地址,找到指令的同时也就找到了数据。

8.16位寻址方式时段寄存器、基址寄存器、变址寄存器和位移量的关系见表

32位微处理器通用寄存器 32位微处理器指令系统之寻址方式(3)

在介绍各种寻址方式之前,先说明指令格式中出现的助记符号:

32位微处理器通用寄存器 32位微处理器指令系统之寻址方式(4)

指令格式中出现的助记符号

立即寻址

操作数位置:内存代码段。

立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。 立即数可以是8位无符号整数或16位无符号整数,但不可以是小数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值。

寄存器寻址

说明:寄存器中寄存的内容就是操作数。

操作数位置:CPU中的某个寄存器。

例1, INC AX

其中,INC为 1指令操作符,其操作数地址为寄存器AX在机器指令中的编码,不同的寄存器使用不同的编码加以编排。本条指令的操作数就在AX中。假定执行前(AX)=1234H,则执行后(AX)=1235H。

例2:ADD EAX,EBX

这是一条双操作数指令,其中ADD为加法指令操作符,它的两个加数分别由EAX和EBX提供。假定执行前(EAX)=12345678H,(EBX)=00000034H,则执行后(EAX)=123456ACH,EBX寄存器值不变。

存储器寻址方式

操作数位置:通常在内存数据段DS与堆栈段SS中。

程序运行所使用的数据大都保存在主存储器中,用指令存取存储器操作数的方式较多,即存储器寻址的方式较多。

1.直接寻址

在直接寻址方式中,操作数的16或32位偏移地址EA紧跟在指令操作码后面,即操作数的偏移地址EA与操作码一起存放在代码段中,而操作数可以存放在数据段,也可以存放在其他段。

例3: 假定在数据段DS有双字变量定义为:

VAR DD 12345678H(32位)

其中VAR是变量名,在经过汇编与连接生成可执行程序在执行时,

它有实际物理地址,由段寄存器DS与偏移地址EA组成。

在执行指令MOV EAX,VAR时,

其功能是:根据变量名VAR的DS和EA,

从数据段内偏移地址为EA的内存单元,

连续读取4个字节数送给EAX,

即(EAX)=12345678H。

(EAX)表示EAX中的内容。

2.基址寻址

以8个基址寄存器中任一个寄存器中的值 作为操作数的偏移地址,

其中,以EAX、EBX、ECX、EDX、ESI、EDI作为基址寄存器时,

默认访问段是数据段DS,

以EBP和ESP作为基址寄存器时,默认访问的段是堆栈段SS。

例4: MOV AX,[EBX] ;访问DS段

MOV AX,[EBP] ;访问SS段

3.基址加位移寻址

以8个32位通用寄存器中任意一个寄存器作为基地址寄存器,

再加上8位或32位的位移量,(位移量可以是正,也可以是负),

修改基地址寄存器的值使之成为新的所要寻找操作数的偏移地址。

默认的段与基址寻址相同。

例5: MOV AX,[EBX-08H] ;访问DS段

MOV AX,[EBP 34H] ;访问SS段

4.比例变址寻址

选取除ESP之外的7个32位通用寄存器中任意一个寄存器作为变址寄存器,

将变址寄存器的值乘以一个比例常数(1、2、4、8),最后形成操作数的偏移地址。

例6:

MOV AX, [EBX*2] ;访问DS段

MOV ECX,[EBP*8] ;访问SS段

基址寄存器和变址寄存器如果同时出现时一般用于高级语言中的二维数组,如a[i][j]

基址寄存器中放i,变址寄存器中放j如a[i];只需一个基址寄存器中放i就好 ;

段首地址由DS,ES,SS等确定;就是那个a

所以,寻址方式多是为了满足高级语言的需要。

如a[i][j]:i是行偏移,j是列偏移。

比例的作用是为了表示不同的类型如 int a[i][j]和 float a[i][j]

类型不同,每个数据所占的字节不同

加比例因子说明每次读取相应的字节。

ESP做堆栈指针,不能随便赋值

5.比例变址加位移寻址

选取除ESP之外的7个32位通用寄存器中任意一个寄存器作为变址寄存器,将变址寄存器的值乘以一个比例常数(1、2、4、8),将换算结果再加上带符号的8位或32位的位移量,最后形成操作数的偏移地址。

例7

MOV AX,[EBX*2-30H] ;访问DS段

MOV AX,[EBP*8 4567H] ;访问SS段

6.基址加比例变址寻址

以8个32位通用寄存器中任意一个寄存器作为基地址寄存器,再加上除ESP之外的7个32位通用寄存器中任意一个寄存器作为变址寄存器,将变址寄存器的值乘以一个比例常数(1、2、4、8),其换算结果作为操作数的偏移地址;由基址寄存器确定使用DS段还是SS段,其规定相同于基址寻址。

例8

MOV AL,[EDX EBP*2] ;EDX是基址寄存器,访问DS段

MOV EAX,[EBP ECX*8] ;EBP是基址寄存器,访问SS段

MOV EAX,[EBX][EDI] ;EBX是基址寄存器,访问DS段

MOV EAX,[ESP][EBP] ;ESP是基址寄存器,访问SS段

7.基址加比例变址加位移寻址

这种寻址方式是在基址加比例变址寻址基础上,再加上8或32位位移量,构成32位偏移地址。实际上它是公式3-1即EA = 基址 (变址*比例因子) 位移量的综合应用。

例9

MOV BL,[ESI EBP*2 60H] ;访问DS段

MOV EAX,[EBP EDI*8 3344H] ;访问SS段

MOV EAX,[EBP][EDX] ;EBP是基址寄存器,访问SS段

基址 (变址*比例因子) 位移量

注意: 指令MOV AX,3[BX] ,MOV AX, 2[BX SI] 中的3[BX]与 2[BX SI]是什么意思? 3[BX] 与2[BX SI]是寻址方式的表示形式, 3[BX]是相对基址寻址, 2[BX SI]是相对基址加变址寻址。 这两种寻址方式都是用于寻找内存操作数的, 用来指定内存操作数的地址。 3[BX]指示的内存偏移地址为:BX 3; 2[BX SI]指示的内存偏移地址为:BX SI 2。

8.16位的存储器寻址方式

32位CPU兼容16位CPU的寻址方式,也兼容16位的指令系统,在编写32位程序时,不可避免地要使用16位指令系统编程,在16位CPU的寻址方式中,存储器寻址仍然是主要的,这是因为16位的立即寻址、寄存器寻址与32位的相同,容易理解,下面简单介绍16位的存储器寻址方式。

(1)直接寻址

指令中直接给出了16位偏移地址,物理地址=段寄存器值*16 偏移地址。

例10

MOV BL,[2060H] ;访问DS段

MOV AX,[3344H] ;访问DS段

(2)基址寻址

指令中以基址寄存器BX或BP中值为16位的偏移地址访问内存,

物理地址 = 段寄存器值*16 偏移地址。

以BX和BP为基址寄存器分别访问数据段和堆栈段。

例11

MOV AL,[BX] ;访问DS段

MOV DX,[BP] ;访问SS段

关于基址寻址,还有另外一种形式,称为相对基址寻址,

它是在基址寄存器的基础上,加上一个带符号的8位或16位的位移量。

例12

MOV AL,[BX 30H] ;访问DS段

MOV DX,[BP-1110H] ;访问SS段

(3)变址寻址

指令中以源变址寄存器SI或目的变址寄存器DI中值为16位的偏移地址访问内存,

物理地址=段寄存器值*16 偏移地址。所访问的数据段都是DS数据段。

例13

MOV AL,[SI] ;访问DS段

MOV DX,[DI] ;访问DS段

关于变址寻址,还有另外一种形式,称为相对变址寻址,

它是在变址寄存器的基础上,加上一个带符号的8位或16位的位移量。

例14

MOV AL,[SI-40H] ;访问DS段

MOV DX,[DI 1000H] ;访问DS段

(4)基址(加)变址寻址

指令中以基址寄存器的值加上变址寄存器的值所换算的结果作为偏移地址访问内存,基址寄存器与变址寄存器的组合以及默认访问的段。

例15

MOV AL,[BX SI] ;访问DS段,可以写成MOV AL,[BX][SI]形式

MOV DX,[BP DI] ;访问SS段,可以写成MOV DX,[BP][DI]形式

(5)相对基址(加)变址寻址

相对基址(加)变址寻址是在基址(加)变址寻址的基础之上,加上一个带符号的8位或16位的位移量,最后形成一个16位的偏移地址,所访问的段、基址寄存器与变址寄存器的组合与上述的相同。

例16

MOV AL,[BX SI 10H] ;访问DS段,可以写成MOV AL,[BX][SI 10H]形式

MOV DX,[BP DI-29H] ;访问SS段,可以写成MOV DX,[BP][DI-29H]形式

,