1. 程式人生 > >組合語言基礎四 —— 運算元的定址方式

組合語言基礎四 —— 運算元的定址方式

另外,在32位微機系統中,為了擴大對儲存單元的定址能力,增加了一種新的定址方式——32位地址的定址方式

    1.立即定址方式

運算元作為指令的一部分而直接寫在指令中,這種運算元稱為立即數,這種定址方式也就稱為立即數定址方式。

立即數可以是8位、16位或32位,該數值緊跟在操作碼之後。如果立即數為16位或32位,那麼,它將按“高高低低”的原則進行儲存。

    2.暫存器定址方式

指令所要的運算元已儲存在某暫存器中,或把目標運算元存入暫存器。把在指令中指出所使用暫存器(即:暫存器的助憶符)的定址方式稱為暫存器定址方式。

指令中可以引用的暫存器及其符號名稱如下:

、8位暫存器有:AH、AL、BH、BL、CH、CL、DH和DL等;

、16位暫存器有:AX、BX、CX、DX、SI、DI、SP、BP和段暫存器等;
、32位暫存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。

暫存器定址方式是一種簡單快捷的定址方式,源和目的運算元都可以是暫存器。

3.直接定址方式

指令所要的運算元存放在記憶體中,在指令中直接給出該運算元的有效地址,這種定址方式為直接定址方式。

在通常情況下,運算元存放在資料段中,所以,其實體地址將由資料段暫存器DS和指令中給出的有效地址直接形成,但如果使用段超越字首,那麼,運算元可存放在其它段。

注意:立即定址方式和直接定址方式的書寫格式的不同,直接定址的地址要寫在括號“[”,“]”內。在程式中,直接地址通常用記憶體變數名來表示,如:MOV BX, VARW,其中,VARW

是記憶體字變數。

試比較下列指令中源運算元的定址方式(VARW是記憶體字變數):

MOV AX, 1234H MOV AX, [1234H] ;前者是立即定址,後者是直接定址
MOV AX, VARW MOV AX, [VARW] ;兩者是等效的,均為直接定址

4.暫存器間接定址方式

運算元在儲存器中,運算元的有效地址用SIDIBXBP等四個暫存器之一來指定,稱這種定址方式為暫存器間接定址方式。

在不使用段超越字首的情況下,有下列規定:

若有效地址用SIDIBX等之一來指定,則其預設的段暫存器為DS
若有效地址用BP來指定,則其預設的段暫存器為SS(即:堆疊段)。

     5.暫存器相對定址方式

運算元在儲存器中,其有效地址是一個基址暫存器(BXBP)或變址暫存器(SIDI)的內容和指令中的8位/16位偏移量之和。其有效地址的計算公式如右式所示。

在不使用段超越字首的情況下,有下列規定:

、若有效地址用SIDIBX等之一來指定,則其預設的段暫存器為DS

、若有效地址用BP來指定,則其預設的段暫存器為SS

指令中給出的8位/16位偏移量用補碼錶示。在計算有效地址時,如果偏移量是8位,則進行符號擴充套件成16位。當所得的有效地址超過0FFFFH,則取其64K的模。

6.基址加變址定址方式

運算元在儲存器中,其有效地址是一個基址暫存器(BXBP)和一個變址暫存器(SIDI)的內容之和。其有效地址的計算公式如右式所示。

在不使用段超越字首的情況下,規定:如果有效地址中含有BP,則預設的段暫存器為SS;否則,預設的段暫存器為DS

7.相對基址加變址定址方式

運算元在儲存器中,其有效地址是一個基址暫存器(BXBP)的值、一個變址暫存器(SIDI)的值和指令中的8位/16位偏移量之和。

在不使用段超越字首的情況下,規定:如果有效地址中含有BP,則其預設的段暫存器為SS;否則,其預設的段暫存器為DS

指令中給出的8位/16位偏移量用補碼錶示。在計算有效地址時,如果偏移量是8位,則進行符號擴充套件成16位。當所得的有效地址超過0FFFFH,則取其64K的模。

從相對基址加變址這種定址方式來看,由於它的可變因素較多,看起來就顯得複雜些,但正因為其可變因素多,它的靈活性也就很高。比如:

D1[i]來訪問一維陣列D1的第i個元素,它的定址有一個自由度,用D2[i][j]來訪問二維陣列D2的第i行、第j列的元素,其定址有二個自由度。多一個可變的量,其定址方式的靈活度也就相應提高了。

相對基址加變址定址方式有多種等價的書寫方式,下面的書寫格式都是正確的,並且其定址含義也是一致的。

MOV AX, [BX+SI+1000H]   MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI]    MOV AX, 1000H[SI][BX]

但書寫格式BX [1000+SI]和SI[1000H+BX]等是錯誤的,即所用暫存器不能在“[“,”]”之外,該限制對暫存器相對定址方式的書寫也同樣起作用。

相對基址加變址定址方式是以上7種定址方式中最複雜的一種定址方式,它可變形為其它型別的儲存器定址方式。表3.1列舉出該定址方式與其它定址方式之間的變形關係。

表3.1 相對基址加變址定址方式與其它定址方式之間的變形關係

源運算元

指令的變形

源運算元的定址方式

只有偏移量

MOV AX, [100H]

直接定址方式

只有一個暫存器

MOV AX, [BX] 或 MOV AX, [SI]

暫存器間接定址方式

有一個暫存器和偏移量

MOV AX, [BX+100H] 或 MOV AX, [SI+100H]

暫存器相對定址方式

有二個暫存器

MOV AX, [BX+SI]

基址加變址定址方式

有二個暫存器和偏移量

MOV AX, [BX+SI+100H]

相對基址加變址定址方式



8.32位地址的定址方式

在32位微機系統中,除了支援前面的七種定址方式外,又提供了一種更靈活、方便,但也更復雜的記憶體定址方式,從而使記憶體地址的定址範圍得到了進一步擴大。

在用16位暫存器來訪問儲存單元時,只能使用基地址暫存器(BXBP)和變址暫存器(SIDI)來作為地址偏移量的一部分,但在用32位暫存器定址時,不存在上述限制,所有32位暫存器(EAXEBXECXEDXESIEDIEBPESP)都可以是地址偏移量的一個組成部分。

當用32位地址偏移量進行定址時,記憶體地址的偏移量可分為三部分:一個32位基址暫存器,一個可乘1、2、4或8的32位變址暫存器,一個8位/32位的偏移常量,並且這三部分還可進行任意組合,省去其中之一或之二。

32位基址暫存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位變址暫存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。

下面列舉幾個32位地址定址指令:

MOV AX, [123456H]

MOV EAX, [EBX]

MOV EBX, [ECX*2]

MOV EBX, [EAX+100H]

MOV EDX, [EAX*4+200H]

MOV EBX, [EAX+EDX*2]

MOV EBX, [EAX+EDX*2+300H]

MOV AX, [ESP]

由於32位定址方式能使用所有的通用暫存器,所以,和該有效地址相組合的段暫存器也就有新的規定。具體規定如下:

1、地址中暫存器的書寫順序決定該暫存器是基址暫存器,還是變址暫存器;

如:[EBX+EBP]中的EBX是基址暫存器,EBP是變址暫存器,而[EBP+EBX]中的EBP是基址暫存器,EBX是變址暫存器;

2、預設段暫存器的選用取決於基址暫存器;

3、基址暫存器是EBPESP時,預設的段暫存器是SS,否則,預設的段暫存器是DS

4、在指令中,如果使用段字首的方式,那麼,顯式段暫存器優先。

下面列舉幾個32位地址定址指令及其記憶體運算元的段暫存器。

指令的舉例 訪問記憶體單元所用的段暫存器
MOV  AX, [123456H] ;預設段暫存器DS
MOV  EAX, [EBX+EBP] ;預設段暫存器DS
MOV  EBX, [EBP+EBX] ;預設段暫存器SS
MOV  EBX, [EAX+100H] ;預設段暫存器DS
MOV  EDX, ES:[EAX*4+200H] ;顯式段暫存器ES
MOV  [ESP+EDX*2], AX  ;預設段暫存器SS
MOV  EBX, GS:[EAX+EDX*2+300H] ;顯式段暫存器GS
MOV  AX, [ESP]  ;預設段暫存器SS