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