-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)轉移類指令尋址