【微机原理与接口技术】三、8086寻址方式

-8086寻址方式:

寻址方式:指令中说明操作数所在地址的方法。

指令区别:计算机指令通常包含操作码和操作数两部分。指令有单操作数、双操作数、无操作数的区别。双操作数要用逗号将两操作数分隔开,逗号右边操作数称为源操作数,逗号左边操作数称为目的操作数。

 

 

1、立即寻址方式(Immediate Addressin)

操作数以立即数的形式直接包含在指令内。

-注意:所有指令中,立即数只能作源操作数,不能作目的操作数。以A~F打头的数字出现在指令中时,前面一定要加数字0,以免与其他符号相混淆。

MOV AL, 26H ;将8位立即数26H送到AL

MOV CX, 2A50H ;将16位立即数2A50H送到CX

 

2、寄存器寻址方式(Register Addressing)

操作数包含在寄存器中,由指令指定寄存器的名称。16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP等;8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH、DL。

-注意:源操作数与目的操作数的长度必须一致。

MOV DX, AX ;将AX中的值赋给DX,AX内容不变

 

3、直接寻址方式(Direct Addressing)

1)直接寻址方式

操作数的偏移地址称为有效地址EA(Effective Addressing),直接寻址时,存储单元的有效地址直接由指令给出,该地址单元中的数据总是存放在存储器中,所以必须先求出操作数的物理地址,然后再访问存储器,才能取得操作数。

-注意:如果指令中没有用前缀指明操作数存放在那一段,默认使用的段寄存器时数据段寄存器DS (操作数物理地址 = 16 × DS + EA),指令中有效地址必须加方括号[ ],与立即数区别开。

MOV AX, [2000H]

;EA=2000H,假设DS=3000H

;源操作数物理地址 = DS × 10H + EA = 32000H

;由于目的寄存器是AX(16位),将该地址处的字送入AX

 

2)段超越前缀

如果要对代码段、堆栈段、附加段寄存器所指出的存储区进行直接寻址,应当在指令中指定段超越前缀

MOV AX, ES:[500H]

;源操作数物理地址 = 16 × ES + 500H

 

3)符号地址

允许用符号地址代替数值地址(给存储单元取名字)

AREA1  EQU  0867H

MOV    AX,  AREA1

;等值伪指令EQU用来给常数0867H定义符号名AREA1

;从有效地址为AREA1的存储单元中取出一个字送到AX中

 

AREA1  DW   0867H

MOV    AX,  AREA1

;DW伪指令语句用来定义变量

;变量用作表示存储器中的数据

 

也可写成

MOV  AX, [AREA1]

也允许段超越

MOV  AX,ES:[AREA1]

MOV  AX,ES:AREA1

 

4、寄存器间接寻址方式(Register Indirect Addressing)

指令中给出的寄存器中的值不是操作数本身,而是操作数的有效地址。

-注意:寄存器名称外面必须加方括号,语句存期寻址方式相区别。指令中使用的寄存器有基址寄存器BX、BP和变址寄存器SI、DI。若指定寄存器是BX、SI、DI,则默认操作数存放在数据段中,使用DS内容作为段地址。若指定寄存器BP,则默认操作数在堆栈段中,段地址在SS中。即:

物理地址 = 16 × DS + BX

          或 = 16 × DS + SI

          或 = 16 × DS + DI

          或 = 16 × SS + BP

也可以指定段超越前缀来从默认段以外的段中取得数据

 

MOV  BX, [SI]

;设DS=1000H,SI=2000H,(12000H)=318BH

;物理地址 = 16 × DS + SI = 12000H

;执行后BX=318BH

 

 

5、寄存器相对寻址方式(Register Relative Addressing)

操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量(Displacement)之和。物理地址计算同寄存器间接寻址,即:

物理地址 = 16 × DS + BX

          或 = 16 × DS + SI

          或 = 16 × DS + DI

          或 = 16 × SS + BP

 

MOV  BX,COUNT[SI]

;设DS=3000H,SI=2000H位移量COUNT=4000H

;物理地址 = 16 × DS + SI + COUNT = 36000H

 

也可表示为

MOV  BX, [COUNT + SI]

也允许段超越前缀

MOV  DH, ES:ARRAY[SI]

 

 

6、基址变址寻址方式(Based Indexed Addressing)

操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,两个寄存器均由指令指定

若:基址寄存器为BX,段址寄存器用DS

则:物理地址  = 16 × DS + BX + SI

       或            = 16 × DS + BX + DI

若:基址寄存器为BP,段址寄存器用SS

则:物理地址  = 16 × SS + BP + SI

       或            = 16 × SS + BP + DI

 

MOV  AX, [BX][SI]

;设:DS=3000H,BX=1200H,SI=0500H

;物理地值 = 16 × DS + BX + SI = 31700H

 

指令也可以写成:

MOV  AX, [BX + SI]

 

7、相对基址变址寻址方式(Relative Based Indexed Addressing)

操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上指令中指定的8位或16位位移量之和。

若:基址寄存器为BX,段址寄存器用DS

则:物理地址  = 16 × DS + BX + SI + 8位或16位位移量

       或           = 16 × DS + BX + DI + 8位或16位位移量

若:基址寄存器为BP,段址寄存器用SS

则:物理地址  = 16 × SS + BP + SI + 8位或16位位移量

       或           = 16 × SS + BP + DI + 8位或16位位移量

MOV  AX, MASK[BX][SI]

;设DS=2000H,BX=1500H,SI=0300H,MASK=0200H

;物理地址=16 × DS + BX + SI + MASK = 21A00H

 

指令也可写成:

MOV  AX, [MASK+ BX+SI]

MOV  AX, 200H[BX+SI]

MOV  AX, MASK[BX+SI]

 

8、其他寻址方式

1)隐含寻址

指令中不指明操作数,但有隐含规定的寻址方式。例如指令DAA。

 

2)I/O端口寻址

8086有直接端口和间接端口两种寻址方式。

①直接端口寻址

端口地址由指令直接提供,它是一个8位立即数。由于8位二进制数的最大值为255,所以在这种寻址方式中,能访问的端口号为00~FFH,即256个端口。

IN  AL, 63H

;将端口63H中的内容送入AL

②间接寻址

被寻址的端口号由寄存器DX提供,这种寻址方式能访问多达64K个I/O端口,端口号0000~FFFFH

MOV  DX, 213H

IN       AL, DX

;DX=端口地址号213H

;AL<-端口213H的内容

 

3)一条指令中有几种寻址方式

目的操作数也可以用除立即寻址以外的所有寻址方式指定,许多指令还具有各自的隐含规则。

MOV  [BX], AL

;设BX=3600H,DS=1000H,AL=05H

;目的操作数的物理地址

;=16 × DS + BX =13600H

;指令执行结果为

;(13600H)=05H

 

4)转移类指令寻址

 

猜你喜欢

转载自blog.csdn.net/JifengZ9/article/details/106881867