組合語言基礎四 —— 運算元的定址方式
另外,在32位微機系統中,為了擴大對儲存單元的定址能力,增加了一種新的定址方式——32位地址的定址方式。
1.立即定址方式
運算元作為指令的一部分而直接寫在指令中,這種運算元稱為立即數,這種定址方式也就稱為立即數定址方式。
立即數可以是8位、16位或32位,該數值緊跟在操作碼之後。如果立即數為16位或32位,那麼,它將按“高高低低”的原則進行儲存。
2.暫存器定址方式
指令所要的運算元已儲存在某暫存器中,或把目標運算元存入暫存器。把在指令中指出所使用暫存器(即:暫存器的助憶符)的定址方式稱為暫存器定址方式。
指令中可以引用的暫存器及其符號名稱如下:
、8位暫存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
、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.暫存器間接定址方式
運算元在儲存器中,運算元的有效地址用SI、DI、BX和BP等四個暫存器之一來指定,稱這種定址方式為暫存器間接定址方式。 |
在不使用段超越字首的情況下,有下列規定:
若有效地址用SI、DI和BX等之一來指定,則其預設的段暫存器為DS;
若有效地址用BP來指定,則其預設的段暫存器為SS(即:堆疊段)。
5.暫存器相對定址方式
運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)或變址暫存器(SI、DI)的內容和指令中的8位/16位偏移量之和。其有效地址的計算公式如右式所示。
|
指令中給出的8位/16位偏移量用補碼錶示。在計算有效地址時,如果偏移量是8位,則進行符號擴充套件成16位。當所得的有效地址超過0FFFFH,則取其64K的模。
6.基址加變址定址方式
運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)和一個變址暫存器(SI、DI)的內容之和。其有效地址的計算公式如右式所示。 |
在不使用段超越字首的情況下,規定:如果有效地址中含有BP,則預設的段暫存器為SS;否則,預設的段暫存器為DS。
7.相對基址加變址定址方式
運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)的值、一個變址暫存器(SI、DI)的值和指令中的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位暫存器來訪問儲存單元時,只能使用基地址暫存器(BX和BP)和變址暫存器(SI和DI)來作為地址偏移量的一部分,但在用32位暫存器定址時,不存在上述限制,所有32位暫存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一個組成部分。
當用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位地址定址指令:
由於32位定址方式能使用所有的通用暫存器,所以,和該有效地址相組合的段暫存器也就有新的規定。具體規定如下: 1、地址中暫存器的書寫順序決定該暫存器是基址暫存器,還是變址暫存器; |
如:[EBX+EBP]中的EBX是基址暫存器,EBP是變址暫存器,而[EBP+EBX]中的EBP是基址暫存器,EBX是變址暫存器;
2、預設段暫存器的選用取決於基址暫存器;
3、基址暫存器是EBP或ESP時,預設的段暫存器是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 |