新聞中心

8086尋址方式

作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏


  這種尋址方式也為堆棧處理提供了方便。
  一般(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],或 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。

與轉(zhuǎn)移地址有關(guān)的尋址方式

  前面的與數(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)間接尋址、段間直接尋址、段間間接尋址。

 三個(gè)表示轉(zhuǎn)移距離(稱為位移量)的操作符:SHORT、NEA*、**R。

  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位。

 例 段內(nèi)直接尋址方式

            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]

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 8086尋址方

評(píng)論


技術(shù)專區(qū)

關(guān)閉