這一節講解8086/8088尋址方式,所謂尋址方式,就是尋找操作數或操作數地址的方式。
尋址方式
8086/8088有七種基本的尋址方式:立即尋址,寄存器尋址,直接尋址,寄存器間接尋址,寄存器相對尋址,基址變址尋址,相對基址變址尋址。
其中,后五種尋址方式(即直接尋址、寄存器間接尋址、寄存器相對尋址、基址變址尋址和相對基址變址尋址)屬於存儲器尋址,用於說明操作數或操作數地址所在存儲單元的地址。這五種方式也就是確定存放操作數的存儲單元有效地址EA的方法,這里所說的有效地址就是在前面一節講存儲器分段中所說的段內偏移地址。
除了這些基本的尋址方式以外,還有固定尋址和I/O端口尋址等,但不會在本節中介紹到。
基本尋址方式
下面重點說一下這七種基本尋址方式的特點:
1. 立即尋址方式
先解釋一個概念,叫做立即數。
操作數包含在指令中,它作為指令的一部分,跟在操作碼后存放在代碼段。這種操作數稱為立即數。
立即尋址方式所提供的操作數緊跟在操作碼后面,與操作碼一起放在指令代碼段中,不需要到其他地址單元中去取。立即數可以是8位,也可以是16位。這種尋址方式主要用於給寄存器或存儲單元賦初值的場合。立即尋址方式是這七種尋址方式中速度最快的尋址方式。
舉例:MOV AX, 1234H ; 給AX寄存器賦值為1234H
2. 寄存器尋址方式
寄存器尋址的特點是操作數在CPU內部的寄存器中,在指令中指定寄存器號。
對於16位操作數,寄存器可以是AX、BX、CX、DX、SI、DI和SP等;
對於8位操作數,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。
例如:MOV SI, AX
MOV AL, DH
由於操作數在寄存器中,不需要通過訪問存儲器來取得操作數,所以采用寄存器尋址方式的指令執行速度較快。
3. 直接尋址方式
直接尋址的操作數在存儲器中,指令直接包含有操作數的有效地址。由於操作數一般存放在數據段,所以操作數的地址由DS加上指令中給出的16位偏移得到。
假如DS內容是5000H,地址為51234H字存儲單元中的內容時6789H,那么在執行“MOV AX, [1234H]”后寄存器AX的內容是6789H。
由於該指令所用的段寄存器為DS,所以該條指令還可以寫為"MOV AX, DS:[1234H]"。
當然,除了DS段寄存器以外,還可以指定其他段寄存器。
例如:MOV ES:[5678H], BL ; 指定ES作為段寄存器
這種尋址方式常用於處理單個存儲器變量的情況。它可以實現在64K字節的段內尋找操作數。直接尋址的操作數通常是程序使用的變量。
4. 寄存器間接尋址方式
寄存器間接尋址的操作數在存儲器中,操作數有效地址在SI、DI、BX、BP這四個寄存器之一中。在一般情況下,如果有效地址在SI、DI和BX中,則以DS段寄存器的內容為段值;如果有效地址在BP中,則以SS段寄存器的內容為段值。
例如:MOV AX, [SI] ; 自動引用DS作為段寄存器
假設 (DS)= 5000H, (SI)= 1234H
那么存儲的物理存儲單元地址是51234H。再設該字存儲單元的內容是6789H,那么在執行該指令后,(AX)= 6789H。
當然也可以指定段超越前綴,如:
MOV DL, CS:[BX] ;引用的段寄存器是CS
如果有效地址在BP中,那么引用的段寄存器為SS。如:
MOV [BP], CX ;此時引用的段寄存器是SS
這種尋址方式可以用於表格處理,在處理完表中的一項后,只要修改指針寄存器的內容就可以方便地處理表中的另一項。
注意同寄存器尋址方式的書寫方式予以區別。
5. 寄存器相對尋址方式
操作數在存儲器中,操作數的有效地址是一個基址寄存器(BX、BP)或變址寄存器的(SI、DI)內容加上指令中給定的8位或16位位移量之和。
即 EA = (BX)或(BP)或(SI)或(DI) + 8位或16位位移量
在一般情況下,如果SI、DI或BX的內容作為有效地址的一部分,那么引用的段寄存器是DS。如:
MOV AX, [DI+1223H] ; 引用的段寄存器是DS
假設,(DS)= 5000H,(DI)= 3678H。
那么,存取的物理存儲單元地址是5489BH。再假設該字存儲單元的內容是55AAH,那么在執行該指令后,(AX)= 55AAH。
而當BP的內容作為有效地址一部分時,那么引用的段寄存器是SS,如:
MOV BX, [BP-4] ; 引用的段寄存器是SS
當然也可以自行指定段寄存器,如:
MOV ES:[BX+5], AL ; 引用ES作為段寄存器
這種尋址方式同樣可用於表格處理,表格的首地址可設置為指令中的位移量,利用修改基址或變址寄存器的內容來存取表格中的項值。
以下兩種寫法等價:
MOV AX, [SI+3]
MOV AX, 3[SI]
6. 基址變址尋址方式
操作數在存儲器中,操作數的有效地址由基址寄存器之一的內容與變址寄存器之一的內容相加得到。
即:EA = (BX)或(BP) + (SI)或(DI)
在一般情況下,如果BP的內容作為有效地址的一部分,則以SS的內容作為段值,否則以DS的內容作為段值。
當所得的有效地址超過FFFFFH時,就取其64K的模。
例如: MOV AX, [BX+DI] ; 此時引用DS段寄存器
假設,(DS)= 5000H,(BX)= 1223H, (DI)= 54H
那么,存取的物理存儲單元地址是51277H。再假設改字存儲單元的內容是168H,那么在執行該指令后,(AX)= 168H
當然,還可以增加段超越前綴來指定段寄存器。
例如:
MOV AX, ES:[BX+SI] ; 引用ES作為段寄存器
MOV DS:[BP+SI], AL ; 引用DS作為段寄存器
這種尋址方式適用於數組或表格處理。用基址寄存器存放數組首地址,而用變址寄存器來定位數組中的各元素,或反之。
另外,以下兩種表示方法是等價的:
MOV AX, [BX+DI]
MOV AX, [DI][BX]
7. 相對基址變址尋址方式
操作數在存儲器中,操作數的有效地址由基址寄存器之一的內容與變址寄存器之一的內容及指令中給定的8位或16位位位移量相加得到。
即:EA = (BX)或(BP) + (SI)或(DI) + 8位或16位位移量
在一般情況下,如果BP作為有效地址的一部分,則以SS段寄存器的內容為段值,否則以DS段寄存器的內容為段值。
在指令中給定的8位或16位位移量采用補碼形式表示。在計算有效地址時,如果偏移量是8位,那么被帶符號擴展成16位。當所得的有效地址超過FFFFH時,就取其64K的模。
舉例:MOV AX, [BX+DI-2] ; 自動引用DS作為段寄存器
假設,(DS)= 5000H,(BX)= 1223H, (DI)= 54H
那么,存取的物理存儲單元地址是51275H。再設該字存儲單元的內容是7654H,那么在執行該指令后,(AX)= 7654H
以下四種表示方法均是等價的:
MOV AX, [BX+DI+1234H]
MOV AX, 1234H[BX+DI]
MOV AX, 1234H[BX][DI]
MOV AX, 1234H[DI][BX]
盡管相對基址變址這種尋址方式最復雜,但也是最靈活的。