8086尋址方式
這種尋址方式也為堆棧處理提供了方便。
一般(BP)可指向棧頂,從棧頂到數組的首址可用位移量表示,變址寄存器可用來訪問數組中的某個元素。
綜上所述,有效地址可以由以下三種成分組成:
· 位移量(Displacement)是存放在指令中的一個8位或16位數,但它不是立即數,而是一個地址。
· 基址(Base)是存放在基址寄存器(BX或BP)中的內容。它是有效地址中的基址部分,通常用來指向數據段中數組或字符串的首地址。
· 變址(Index)是存放在變址寄存器(SI或DI)中的內容。它通常用來訪問數組中的某個元素或字符串中的某個字符。
有效地址的計算可用下式表示:
EA = 基址 + 變址 + 位移量
這三種成分都可正可負,以保證指針移動的靈活性。它們任意組合使用,可得到不同的尋址方式。
(或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])
如(DS)= 3000H,(BX)= 2000H,(SI)= 1000H,MASK = 0250H,
則物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H
指令執行情況如圖3.6所示,最后的執行結果是(AX)= 1234H。
前面的與數據有關的尋址方式最終確定的是一個數據的地址,而這里的與轉移地址有關的尋址方式最終確定一條指令的地址。順序執行的指令地址是由指令指針寄存器IP自動增量形成的,而程序轉移的地址必須由轉移類指令和CALL指令指出,這類指令表示轉向地址的尋址方式包括:段內直接尋址、段內間接尋址、段間直接尋址、段間間接尋址。
SHORT表示位移量在-128~127字節之間。
NEA*表示在同一段內轉移,位移量在-32768~32767字節范圍內。
**R表示轉移距離超過±32K字節,或是在不同段之間轉移。
因為CS:IP寄存器總是指向下一條將要執行的指令的首地址(稱為IP當前值),當轉移指令執行后,必須修改IP或CS、IP的值。當轉移指令給出位移量時,用IP當前值加上位移量即為新的IP的值。
SHORT轉移,稱為短轉移,位移量用一個字節(8位)來表示。
NEAR轉移,稱為近轉移,位移量用16位表示,因為程序控制仍然在當前代碼段,所以只修改IP的值,CS的值不變。
FAR轉移,稱為遠轉移,因為程序控制超出了當前代碼段,所以CS和IP都必須修改為新的值。
與轉移地址有關的4種尋址方式就是告訴CPU如何修改CS和IP的值,以達到控制程序轉移的目的。
1 段內直接尋址(Intrasegment direct addressing)
這種尋址方式在指令中直接指出轉向地址,如:
JMP SHORT NEXT
JMP NEAR PTR AGAIN
其中,NEXT和AGAIN均為轉向的符號地址。在機器指令中,操作碼之后給出的是相對于當前IP值的位移量(轉移距離),所以,轉向的有效地址是當前IP值與指令中給出的位移量(8位或16位)之和。
注意:這種尋址方式適用于條件轉移及無條件轉移指令,當用于條件轉移指令時,位移量只允許8位。
1060:000D EB04 JMP SHORT NEXT
IP當前值→ 1060:000F … …
1060:0011 … …
1060:0013 0207 NEXT: ADD AL,[BX]
CPU在執行JMP指令時,IP指向了下一條指令,其值為000F,JMP SHORT NEXT指令的機器語言為EB04,EB為操作碼,04為位移量,所以轉向的有效地址應為:
000F + 0004 = 0013
0013正是標號NEXT的地址。JMP指令執行后,將IP寄存器修改為0013,代碼段寄存器CS不變。緊接著CPU根據CS:IP的指示,取出1060:0013中的ADD指令開始執行,這樣實現了程序的轉移。
2 段內間接尋址(Intrasegment indirect addressing)
這種尋址方式在指令中用數據尋址方式(除立即尋址方式外)間接地指出轉向地址,如:
JMP BX
JMP NEAR PTR [BX]
JMP TABLE[SI]
根據指令中的尋址方式,確定一個寄存器或一個存儲單元,其內容就是指定轉向的有效地址。因為程序的轉移仍在同一段內進行,所以只需將IP修改成新的轉向地址,CS不變。段內轉移指令中的NEAR PTR是可以缺省的。
注意:這種尋址方式以及以下的兩種段間尋址方式都不能用于條件轉移指令。
條件轉移指令只能使用段內直接尋址的8位位移量,而JMP和CALL指令則可用四種尋址方式中的任何一種。
假設: (DS)= 2000H,(BX)= 1256H,(SI)= 528FH,
位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。
例 JMP BX
則執行該指令后(IP)= 1256H
例 JMP [BX][SI]
則指令執行后(IP)=(16d ×(DS)+(BX)+(SI))
=(20000H + 1256H + 528FH)
=(264E5H)
= 2450H
3 段間直接尋址(Intersegment direct addressing)
段間直接尋址和段內直接尋址類似,指令中直接給出轉向地址,不同的是,在符號地址之前要加上表示段間遠轉移的 操作符FAR PTR。
指令格式如下:
JMP FAR PTR OUTSEG
因為是段間轉移,CS和IP都要更新,這個新的段地址和偏移地址由指令操作碼之后的連續兩個字提供,所以只要將指令中提供的轉向偏移地址裝入IP,轉向段地址裝入CS,就完成了從一個段到另一個段轉移的工作。
4 段間間接尋址(Intersegment indirect addressing)
這種尋址方式仍然是用相繼兩個字的內容裝入IP和CS來達到段間的轉移目的的,但這兩個字的存儲器地址是通過指令中的數據尋址方式(除立即尋址方式和寄存器尋址方式外)來取得的。
為了說明尋址兩個字單元,指令中必須加上雙字操作符DWORD。指令格式如下:
JMP DWORD PTR [SI]
JMP DWORD PTR[TABLE+BX]
評論