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

2021-06-05 19:01:13 字數 3793 閱讀 3389

微機系統有七種基本的定址方式:立即定址方式、暫存器定址方式、直接定址方式、暫存器間接定址方式、暫存器相對定址方式、基址加變址定址方式、相對基址加變址定址方式等。其中,後五種定址方式是確定記憶體單元有效位址的五種不同的計算方法,用它們可方便地實現對陣列元素的訪問。

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

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

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

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

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

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

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

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

注意:立即定址方式和直接定址方式的書寫格式的不同,直接定址的位址要寫在括號「[」,「]」內。在程式中,直接位址通常用記憶體變數名來表示,如:mov bx, varw,其中,varw是記憶體字變數。

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

mov ax, 1234h

mov ax, [1234h]

;前者是立即定址,後者是直接定址

mov ax, varw

mov ax, [varw]

;兩者是等效的,均為直接定址

運算元在儲存器中,運算元的有效位址用si、di、bx和bp等四個暫存器之一來指定,稱這種定址方式為暫存器間接定址方式。

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

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

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

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

運算元在儲存器中,其有效位址是乙個基址暫存器(bx、bp)和乙個變址暫存器(si、di)的內容之和。其有效位址的計算公式如右式所示。

在不使用段超越字首的情況下,規定:如果有效位址中含有bp,則預設的段暫存器為ss;否則,預設的段暫存器為ds。

運算元在儲存器中,其有效位址是乙個基址暫存器(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]

相對基址加變址定址方式

在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位位址定址指令:

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]

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

組合語言定址方式

組合語言的定址方式 彙編有7種定址方式 mov 是組合語言用得最多的語句 他的使用方法 是 mov 目的位址,源位址 下面便通過mov來介紹組合語言的幾種定址方式 1.立即定址 mov ax,1234h 2.暫存器定址 mov si,ax 源運算元和目的運算元 同時為暫存器 3.直接定址 mov a...

組合語言的定址方式

mov ah,80h 直接給暫存器賦值 如 add vard,eax add varw,ax mov varb,bh等。其中 vard varw和varb是雙字,字和位元組型別的記憶體變數。如 add bh,78h add ax,1234h mov ebx,12345678h等。如 mov eax,...

組合語言之定址方式

1 固定定址 inherent addressing 特定的單運算元指令,運算元隱含在操作碼中,在固定定址的指令中,運算元被隱含在指令中,不需要執行匯流排週期,執行速度快 例子 1.1 cbw命令,將al中的符號位擴充套件到ah中,形成16位的運算元。比如al中的符號位是1,則執行cbw命令後,ah...