七种寻址方式

(一)立即寻址

操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数。这种寻址方式也就称为 立即数寻址方式.

立即数寻址方式通常用于 通用寄存器或内存单元赋初值。

立即数可以是8bit 16bit或 32bit,该数值紧跟在操作码之后。如果立即数为16bit 或32bit,那么

它将按照“高高低低”的原则进行存储 。

example:

mov ah , 80h       add  ax,1234h    mov  ecx,123456h

mov b1 ,12h    mov w,3456h       add d1,32123456h

其中 b1,w1,d1分别是  字节,字,双字。

以上指令中的第二操作数都是立即数,在汇编中规定:立即数不能作为指令的第二操作数,该规定与高级语言

中“赋值语句的左边不能是常量“的规定相一致。

下图是指令 mov  ax,4567h 存储形式和执行示意图。(little-endian)

 

(二)寄存器寻址

指令所要的操作数已存储在某寄存器中,或把目标操作数 存入寄存器。 把在指令中所使用寄存器(即:寄存器的助忆符)的寻址方式成为 寄存器寻址方式。

指令中可以引用的寄存器及其符号名称如下:

  8位寄存器有: AH、AL、BH、BL、CH、CL、DH和DL等;

  16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;

  32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。

寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。

1.源操作数是寄存器寻址方式

如:   add vard,eax       add   varw ,ax     mov  varb ,bh

其中:vard ,varw和varb  分布是 双字,字,字节类型的内存变量。

2、目的操作数是寄存器寻址方式

example: add bh,78h          add ax,1234h          mov  ex,12345678h

3,源和目的操作数都是寄存器寻址方式

example: mov eax,ebx          mov ax,bx   mov dh,bl

由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器。这样,在指令执行过程中,会减少读/写存储器单元的 次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们在编写汇编程序时,应尽可能地使用寄存器寻址方式。

(三)(直接寻址方式)

指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。

在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。

例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?

解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用下图来表示。

从图中,可看出执行该指令要分三部分:
 

由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;

访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;

取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。

所以,在执行该指令后,BX的值就为5213H。
 

由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。

下面指令的目标操作数就是带有段前缀的直接寻址方式。

MOV ES:[1000H], AX

直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。

注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。

试比较下列指令中源操作数的寻址方式(VARW是内存字变量):

  MOV AX, 1234H            MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址 

  MOV AX, VARW           MOV AX, [VARW] ;两者是等效的,均为直接寻址 

七种寻址方式 (四)(寄存器间接寻址方式)

操作数在寄存器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。

该寻址方式 物理地址的计算方式如下:

在不使用段超越前缀的情况下,有下列规定:

若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;

若有效地址用BP来指定,则其缺省的段寄存器为SS (即:堆栈段).

example  :

假设有指令: mov bx,[DI] ,在执行时,(DS)=1000h,(DI)=2345h

存储单元12345h的内容是4354h。问执行指令后,BX的值是什么?

答: 根据寄存器间接寻址方式的规则:在执行本例指令时,寄存器DI的值 不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即:

PA=(DS)*16+DI=1000h *16 +3456h = 123456h

所以,该指令的执行效果是:把从物理地址为12345h开始的一个字的值传送给BX。

其执行过程如下图所示:

(五)(寄存器相对寻址方式)

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8bit、16bit偏移量之和。其有效地址的计算公式如下:

在不使用段超越前缀的情况下,有以下规定:

若有效地址用SI,DI和BX等之一来指定,则其缺省的段寄存器为DS;

若有效地址用BP来指定,则其缺省的段寄存器为SS。

指令中给出的8bit、16bit偏移量用补码表示。 在计算有效地址时候,若偏移量是8bit,则进行符号扩展成16bit。当所得的有效地址超过 offffH,则取其64k的模。

example:假设指令: mov  bx,[SI+100H],在执行它时,(DS)=1000H,   (SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?

答:根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(SI)+100H=2345H+100H = 2445H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2445H = 12445H.

所以,该指令的执行效果是:把从物理地址为12445h开始的一个字的值传送给BX.

其执行过程如图所示:

(六)(基址加变址寻址方式)

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。

其有效地址的计算公式如下:

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;

否则,缺省的段寄存器为DS.

example: 假设指令:MOV BX , [BX+SI], 在执行时,(DS)=1000H,(BX)=2100H, (SI)=0011H,

内存单元12111H的内容为1234H,问该指令执行时,BX的值是什么?

答: 根据基址+变址 寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)=2100H+0011H=2111H

该操作数的物理地址应由DS和EA的值形成,即

PA= (DS)*16+EA=1000H*16+2111H = 12111H

所以,该指令的执行效果: 把从物理地址为12111H开始的一个字的值传送给BX。

其执行过程如图:

(七)(相对基址加变址寻址方式)

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8bit、16bit偏移量之和。

其有效地址的计算公式如下:

在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。

指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

例:假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?

解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)+200H = 2100H+0010H+200H=2310H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2310H = 12310H

所以,该指令的执行效果是:把从物理地址为12310h开始的一个字的值传送给AX.

其执行过程如下图

从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。比如:

用D1[i]来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[i][j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址方式的灵活度也就相应提高了。

相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。

MOV AX,[BX+SI+1000H]               MOV  AX,1000H[BX+SI]

MOV AX ,1000H[BX][SI]                MOV  AX,1000H[SI][BX]

但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。

相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。下表列举出该寻址方式与其它寻址方式之间的变形关系。

猜你喜欢

转载自blog.csdn.net/qq_41848006/article/details/81434447