1. 程式人生 > >運算元的定址方式(暫存器間接,基址定址,間址定址,比例間接定址)

運算元的定址方式(暫存器間接,基址定址,間址定址,比例間接定址)

計算機中程式是由按一定順序排列的一系列指令,通常一條指令包括兩方面的內容:操作碼和運算元,操作碼決定要完成的操作,告訴計算機要幹什麼;運算元指參加運算的資料及其所在的單元地址。整條指令以二進位制編碼的形式存放在儲存器中。指令要進行操作,都有相應的資料參加,可是資料在哪裡?是什麼?都是通過不同的方式來找到的。這就是為什麼需要定址。

尋找指令中所需要的運算元或運算元地址的方式稱為定址方式。80486指令系統的定址方式包括三種類型:運算元定址、轉移地址定址及I/O埠定址。其中運算元定址有七種。

4.暫存器間接定址(register indirect addressing)

  • 運算元在儲存器中,其有效地址EA存放在某個暫存器中。暫存器的使用在16位定址和32位定址時不一樣。

(1)16位定址

暫存器

有效地址存放在SI, DI, BX, BP中。
如果指令中指定的暫存器是BX, SI, DI,則運算元在資料段中,段基址在DS中,運算元的實體地址為:

SI:是源變址暫存器,預設段地址和DI一樣,在DS中.和DS聯用
DI:是目的變址暫存器.一般情況下與ds聯用,來確定某個儲存單元的地址
BX:基址暫存器,常用來存放訪問內在時的基地址
BP:是基址指標,段地址預設在SS中.可以定位實體地址,比如:”mov ax,[bp+si+6]/mov ax,[bp+di+6]

SS: 堆疊段地址 ,指出當前堆疊的底部地址,即存放堆疊段的段基值。一旦你確定了堆疊地址,ss也不能隨便改變了
DS:資料段暫存器,指出當前程式使用的資料所存放段的最低地址,即存放資料段的段基值

實體地址

在一般情況下,如果有效地址在SI、DI和BX中,則以DS段暫存器的內容為段值;
這裡寫圖片描述

如果有效地址在BP中,或者是說是指令中指定的暫存器是BP,則運算元在堆疊中,段基址在SS中(SS段暫存器的內容為段值。),運算元的實體地址為:

實體地址=(SS)×16+(BP)

例如:

  • MOV AX, [SI] ; 自動引用DS作為段暫存器,以DS段暫存器的內容為段值

    • 假設 (DS)= 5000H, (SI)= 1234H

    • 注意,在組合語言中,帶方括號“[ ]”的運算元表示儲存器運算元,括號中的內容作為儲存單元的有效地址EA。

    • 若有效地址用SI、DI和BX等之一來指定,則其預設的段暫存器為DS。
    • 暫存器SI的值不是運算元,而是運算元的地址(有效地址)。該運算元的實體地址應由DS和SI的值形成。

    • 實體地址=(DS)×16+(SI)=50000H+1234H=51234H。那麼儲存的物理儲存單元地址是51234H。
      再設該字儲存單元的內容是6789H,那麼在執行該指令後,(AX)= 6789H。

  • MOV DL, CS:[BX] ; CS作為段暫存器

    • 指定段超越字首,此時引用的段暫存器是CS而不是自動引用了DS
    • 目的運算元顯式指定的段暫存器為CS
    • 目的運算元的實體地址PA = CS * 16+BX
    • DL的值為該地址單元中存放的字型別資料
  • MOV AX, [BP] 引用的段暫存器為SS

    • 設SS=3000H,BP=1000H該指令定址及執行過程如圖所示。

    圖3.4 MOV AX, [BP] 指令的定址及執行過程

    • 目的運算元的實體地址PA =(SS)×16+(BP)=30000H+1000H=31000H
    • 把從實體地址為31000H開始的對應的一個字的值傳送給AX暫存器。

(2)32位定址

暫存器

  • 八個32位通用暫存器均可作為暫存器間接定址使用。除ESP和EBP預設段暫存器為SS外,其餘六個通用暫存器均預設段暫存器為DS。
  • 32位cpu通用暫存器: EAX,EBX,ECX,EDX,ESI,EDI(預設為DS)/EBP,ESP(預設預設為SS)

實體地址

**實體地址=(DS/SS)×16+(EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP)**

暫存器間接定址方式用於表格處理,執行完一條指令後,只需要修改暫存器內容就可取出表格中的下一項。

對比暫存器(直接)定址和暫存器間接定址:

對比項 暫存器(直接)定址 暫存器間接定址
含義 指令中指出暫存運算元的暫存器 指令中指明存放運算元偏移地址(有效地址)的暫存器
使用情況 當運算元在暫存器中使用 當運算元地址在暫存器中使用
暫存器的內容 運算元 運算元地址
表示形式 MOV AX, 1234h;ADD VARD,EAX;MOV AX, BX MOV AX,[BX]

5.基址定址(based relative)

  • 基址定址是將CPU中的基址暫存器的內容加上指令格式中的形式地址形成運算元的有效地址。將基址暫存器的內容作為基準地址。而指令的形式地址作為修改量。同形式地址相比,可以靈活設定基址暫存器的位數。
  • 運算元在儲存單元中,運算元的有效地址EA由基址暫存器的內容和指令中給出的位移量之和算出。

格式:

操作碼 基址暫存器號 形式地址

優點

可以擴大定址能力,便於訪問二維陣列中某類指定的元素。解決程式的動態定位問題。

基址暫存器

(1)採用專用暫存器作基址暫存器

EA=(BR)+A
BR為基址暫存器

這裡寫圖片描述
執行過程中BR內容不變,形式地址A可變

(2)採用通用暫存器作基址暫存器

這裡寫圖片描述

使用者指定那個通用暫存器為基址暫存器
基址暫存器的內容有作業系統確定
執行過程中R0內容不變,形式地址A可變

(1)16位定址

BX和BP作為基址暫存器。BX以DS作為預設段暫存器,BP以SS為預設段暫存器。位移量可以是8位或16位。

EA=(BX或BP)+位移量(8或16位)
EA:有效地址
例如:MOV BX, [SI+100H]

(2)32位定址

八個32位通用暫存器均可作為基址暫存器,其中ESP, EBP以SS為預設段暫存器,其餘均以DS為預設段暫存器。位移量為8位或32位。
EA=(基址暫存器)+位移量(8位或32位)

6.間址定址()(indexed relative)

間址暫存器

間址暫存器通常都用來意指由一個指令之輸出或輸入可以直接索引到的暫存器群組。更適當的是稱他們為 “架構暫存器”。

間址定址中,有效地址的計算公式如下:

EA=(間址暫存器)+位移量(8位或32位)

(1)16位定址

僅SI和DI可作為間址暫存器,預設DS為段基址暫存器。

(2)32位定址

除ESP外的其他七個32位的暫存器均可作為間址暫存器,EBP預設SS作為段基址暫存器,其餘以DS作段基址暫存器。

基址定址和間址定址適用於對一維陣列的陣列元素進行檢索操作。常用位移量表示陣列起始地址的偏移量,基址/間址暫存器表示陣列元素的下標,可通過修改下標來獲取陣列元素的值。

7.比例間接定址(proportion indirect addressing)

比例間接定址中有效地址的計算公式如下:

EA=(間址暫存器)×比例因子(2, 4或8)+位移量(8位或32位)

比例間接定址方式只適用於32位定址。

例如:MOV EAX,TABLE[ESI×4]

其中:TABLE為位移量,4是比例因子,ESI乘以4的操作在CPU內部完成。