與數據有關的尋址方式
下面以數據傳送指令MOV為例來說明。其匯編格式為:MOV 目標, 源
1.立即尋址方式(immediate addressing)
操作數直接包含在指令中,緊跟在操作碼之后的尋址方式稱為立即尋址方式,把該操作數稱為立即數。
MOV AL, 6 ;(AL)=6
MOV AX, 3064H ;(AX)=3064
2.寄存器尋址方式(register addressing)
操作數直接包含在寄存器中,由指令指定寄存器號的尋址方式。
MOV BX, AX ;(BX)=(AX)
MOV DI, 5678H ;(DI)=5678H
除以上兩種尋址方式外,以下各種尋址方式的操作數都在存儲器中,其操作數稱為存儲器操作數。
由於80X86對內存采用分段管理,因此由以下尋址方式得到的只是有效地址(簡寫為EA-effective address,在IBM PC中就是操作數地址的偏移量部分)。
有效地址可以由以下四種成分組成:
位移量(displacement)是存放在指令中的一個8位、16位或32位的數,它是一個地址。
基址(base)是存放在基址寄存器中的內容。通常用來指向數據段中數組或字符串的首地址。
變址(index)是存放在變址寄存器中的內容。通常用來訪問數組中的某個元素或字符串中的某個字符。
比例因子(scale factor)是80386以上CPU新增加的。其值可為1、2、4或8。尋址中,可用變址寄存器的內容乘以比例因子來取得變址值。
EA=基址+(變址x比例因子)+位移量
3.直接尋址方式(direct addressing)
操作數的有效地址直接包含在指令中的尋址方式。
有效地址存放在代碼段的指令操作碼之后,但操作數本身在存儲器中,所以必須先求出操作數的物理地址。這種尋址方式常用於存取簡單變量。
MOV AL, [78H]
由於在匯編語言中用符號表示地址,所以指令“MOV AL,VAR”中的源操作數尋址方式是直接尋址,有時也寫做“MOV AL,[VAR]”
4.寄存器間接尋址方式(register indirect addressing)
操作數的有效地址在基址寄存器BX、BP或變址寄存器SI、DI中,而操作數在存儲器中的尋址方式。對於386以上CPU,允許使用任何32位通用寄存器。
MOV AL, [BX]
5.寄存器相對尋址方式(register relative addressing)
也稱為直接變址尋址方式。操作數的有效地址是一個基址(BX、BP)或變址(SI、DI)寄存器的內容和指令中給定的一個位移量(disp)之和。有效地址由2部分組成。對於386以上允許使用任何32位通用寄存器。
即:EA=(基址<或變址>寄存器)+disp
或:EA=(32位通用寄存器)+disp(386型號以上)
例: MOV AL, 8[BX] 或MOV AL, [BX+8]
6.基址變址尋址方式(based indexed addressing)
操作數的有效地址是一個基址寄存器(BX、BP)和一個變址寄存器(SI、DI)的內容之和。386以上允許使用變址部分除ESP以外的任何兩個32位通用寄存器組合。缺省使用段寄存器的情況由基址寄存器決定。允許使用段超越前綴。
MOV AL,[BX][SI] 或MOV AL,[BX+SI]
7.相對基址變址尋址方式(relative based indexed addressing)
操作數的有效地址是一個基址和一個變址寄存器的內容和指令中給定的一個位移量之和。有效地址由三部分組成。80386以上允許使用變址部分除ESP以外的任何兩個32位通用寄存器組合。缺省使用段寄存器的情況由基址寄存器決定。允許使用段超越前綴。
MOV AL,MASK[BX][SI] 或MOV AL,MASK[BX+SI]或MOV AL,[MASK+BX+SI]
8.比例變址尋址方式(scaled indexed addressing)
注意:80386以上的微處理器才提供。
EA=(基址寄存器)+(變址寄存器)×比例因子+disp
其優點在於:對於元素大小為2、4、8字節的數組,可以在變址寄存器中給出元素下標,而由尋址方式控制直接用比例因子把下標轉換為變址值。
可以看出,它實際上是386以上CPU存儲器操作數尋址方式的通用公式。
MOV AX, ARY[BX][4*SI]
與轉移地址有關的尋址方式
這里討論的尋址方式是用來確定轉移及調用(CALL)指令的轉向地址。下面以8086/8088的無條件轉移指令為例來說明,格式為
JMP 目標
這里的目標有各種尋址方式。這些尋址方式可以被分為段內轉移和段間轉移兩類。段內轉移只影響指令指針IP值;段間轉移既要影響IP值,也要影響代碼段寄存器CS的值。
1.段內直接尋址方式(intrasegment direct addressing)
EA=(IP)+(8位或16位)disp
位移量disp是一個相對於指令指針的帶符號數,EA就是要轉向的本代碼段內指令地址的偏移量。
若位移量是8位的,則稱為短轉移,格式JMP SHORT LAB
若位移量是16位的,則稱為近轉移,格式JMP LAB 或JMP NEAR PTR LAB
2.段內間接尋址方式(intrasegment indirect addressing)
轉向的有效地址在一個寄存器或內存單元中,該寄存器號或內存地址按上節介紹的與操作數有關的尋址方式(立即尋址方式除外)獲得。
JMP BX
JMP TABLE[BX]
JMP WORD PTR [BX] ;其中WORD PTR [BX]表示BX指向一個字型內存單元
3.段間直接尋址方式(intersegment direct addressing)
指令中直接給出轉向的4字節的偏移量和段基址。匯編格式為:JMP FAR PTR LAB。執行時偏移量送IP,段基址送CS。
4.段間間接尋址方式(intersegment indirect addressing)
用一個雙字內存變量中的低16位取代IP值,高16位取代CS值,從而實現段間轉移。例 : JMP DWORD PTR [BX];式中DWORD PTR [BX]表示BX指向一個雙字變量。