-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)转移类指令寻址