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