当前位置:课程学习>>第二章>>知识讲解>>视频课堂>>知识点三


知识点三:寻址方式



寻址方式是指令中给出的求出操作数有效地址的方法。

以下视频[录人 2.2.8086寻址方式与指令系统.寻址方式]讲解8086的7种寻址方式:

1.立即寻址

2.寄存器寻址

3.直接寻址

4.寄存器间接寻址

5.寄存器相对寻址

6.基址变址寻址

7.相对基址变址寻址

接下来,我们详细了解每种寻址方式的特点、示例,以及使用时的注意事项。

1.立即寻址,操作数直接出现在指令中,此时的操作数也叫立即数。

立即数紧跟在操作码后面,一起存放在代码段中。

例如:

MOV AX,2010H

在该指令格式中,AX是目标操作数,2010H是源操作数。

操作数2010H使用了立即数寻址。

在所有的指令中,立即数只能作源操作数,不能作目标操作数。立即数应与目标操作数的长度一致。立即数默认采用十进制形式,以十六进制形式出现的立即数应以字母H为后缀。以十六进制形式出现的立即数,若以字母开头,则必须以数字0为前缀。立即数还可以用表示+、-、×、/表示的算术表达式,也可以用圆括号改变运算顺序。立即数只能是整数,不能是小数、变量或其它类型的数据。

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_1.mp4],代码为 示例代码中的 1.asm。

2.寄存器寻址

操作数在寄存器中,在指令中指定寄存器名称。

例如

MOV AX,2010H

在该指令格式中,AX是目标操作数,2010H是源操作数。

在该指令格式中,AX是目标操作数,2010H是源操作数。在该指令格式中,AX是目标操作数,2010H是源操作数。

操作数AX使用了寄存器寻址。

在一条指令中,寄存器寻址方式既可用于源操作数,也可用于目标操作数,还可以两者都用寄存器寻址方式。源操作数与目标操作数的长度应一致。例如,不能将寄存器AX的内容传送到寄存器BH中,也不能将寄存器BH的内容传送到寄存器AX中。两个操作数不能同时为段寄存器。目标操作数不能是代码段寄存器。

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_2.mp4],代码为 示例代码中的 2.asm。

3.直接寻址

操作数在存储器中,指令中以具体数值的形式直接给出操作数所在存储单元的有效地址。为了与立即数区别,该有效地址必须用方括号[]括起。

例如:

MOV AX,[2010H]

该指令的源操作数[2010H]采用直接寻址方式。

若(DS)=2000H,那么指令执行后,(AX)=1225H。

取出存储器地址为 2000H*10H + 2010H = 22010H 处的数据 1225H,移入AX寄存器。

采用直接寻址方式时,如果指令中没有用前缀说明操作数存放在哪个段,则操作数默认存放在数据段。8086系统允许操作数存放在代码段、堆栈段或附加段。此时,就需要在指令中指明段超越。

例如:

MOV ES:[1225H],AX

该指令的目标操作数采用直接寻址方式。操作数存放在由ES指示的附加段中。

物理地址=ES×10H+1225H。

在汇编语言指令中,可以用符号地址代替数值地址。

例如:

MOV AX,NUMA

此时,NUMA是存放操作数的内存单元的符号地址。

上面这条指令还可以写成如下的形式:

MOV AX,[NUMA]

如DATA1数据存放在附加段,则可以用如下的形式指定段跨越前缀:

MOV AX,ES: NUMA

MOV AX,ES:[ NUMA]

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_3.mp4],代码为 示例代码中的 3.asm。

其中数据总线16条,地址总线20条。

4.寄存器间接寻址

操作数的有效地址EA存放在基址寄存器BX、BP或变址寄存器SI、DI中。为了区别于寄存器寻址方式,指令中指定的寄存器名要用[]括起来。

指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。

即,

操作数的物理地址=(DS)×10H+(SI)或(DI)或(BX)

例如:

MOV AX,[SI]

该指令的源操作数采用寄存器间接寻址方式。

若(DS)=2000H,(SI)=2010H,那么指令执行后,(AX)=1225H。

取出在存储器地址为2000H*10H+2010H=22010H处的数据,其值为1225H,移入AX寄存器。

如操作数不存放在间址寄存器默认的段,则指定段超越的指令可采用如下形式。

MOV AX,ES:[SI]

此时,操作数的物理地址=ES×10H+SI。

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_4.mp4],代码为 示例代码中的 4.asm。

5.寄存器相对寻址

操作数的有效地址EA是指令中指定的基址或变址寄存器的值与位移量之和。指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。

操作数的物理地址=(DS)×10H + (SI)或(DI)或(BX) + 8位或16位位移量

操作数的物理地址=(SS)×10H + (BP) + 8位或16位位移量

例如:

MOV AX,8[BX]

该指令的源操作数采用寄存器相对寻址方式。

若(DS)=2000H,(BX)=2008H,那么指令执行后,(AX)=1225H。

把在存储器地址为 2000H*10H + 2008H + 8 = 22010H 处的数据取出,移入AX寄存器。

偏移量是符号数,8位偏移量的取值范围为:00~0FFH(即+127D~-128D);16位偏移量的取值范围为:0000~0FFFFH(即+32767D~-32768D)。8086汇编允许用下面三种形式表示相对寻址,它们是等效的。

MOV AX,[BX]+8

MOV AX,8[BX]

MOV AX,[BX+8]

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_5.mp4],代码为 示例代码中的 5.asm。

6.基址变址寻址

操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值之和。

指令中使用基址寄存器BX时,操作数默认存放在数据段中;

使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。

操作数的物理地址 =(DS)×10H+(SI)或(DI)+(BX)

操作数的物理地址 =(SS)×10H+(SI)或(DI)+(BP)

例如:

MOV AX,[BX] [SI]

该指令的源操作数采用基址变址寻址方式。

若(DS)=2000H,(BX)=2008H,(SI)=8H,那么指令执行后,(AX)=1225H。

从存储器地址为 2000H+2008H+8H处读出数据,移入AX寄存器。

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_6.mp4],代码为 示例代码中的 6.asm。

7.相对基址变址寻址

操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值以及8位或16位位移量之和。指令中使用基址寄存器BX时,操作数默认存放在数据段中;使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。

操作数的物理地址 =(DS)×10H+(SI)或(DI)或(BX)+8位或16位位移量s

操作数的物理地址 =(SS)×10H+(SI)或(DI)或(BP)+8位或16位位移量

例如:

MOV AX,3[BX] [SI]

该指令的源操作数采用寄存器相对寻址方式。

若(DS)=2000H,(BX)=2008H,(SI)=5H,那么指令执行后,(AX)=1225H。

从存储器地址为 2000H+2008H+5H+3=22010H处读出数据,移入AX寄存器。

原理及操作示例,在[录屏\02 8086寻址方式与指令系统_7.mp4],代码为 示例代码中的 7.asm。

进入下一个知识点的学习