一、立即尋址方式
操作數(shù)作為指令的一部分而直接寫(xiě)在指令中,這種操作數(shù)稱(chēng)為立即數(shù),這種尋址方式也就稱(chēng)為立即數(shù)尋址方式。
立即數(shù)可以是8位、16位或32位,該數(shù)值緊跟在操作碼之后。如果立即數(shù)為16位或32位,那么,它將按“高高低低”的原則進(jìn)行存儲(chǔ)。例如:
MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H
MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H
其中:B1、W1和D1分別是字節(jié)、字和雙字單元。
以上指令中的第二操作數(shù)都是立即數(shù),在匯編語(yǔ)言中,規(guī)定:立即數(shù)不能作為指令中的第二操作數(shù)。該規(guī)定與高級(jí)語(yǔ)言中“賦值語(yǔ)句的左邊不能是常量”的規(guī)定相一致。
立即數(shù)尋址方式通常用于對(duì)通用寄存器或內(nèi)存單元賦初值。圖是指令“MOV AX, 4576H”存儲(chǔ)形式和執(zhí)行示意圖。
二、寄存器尋址方式
指令所要的操作數(shù)已存儲(chǔ)在某寄存器中,或把目標(biāo)操作數(shù)存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助憶符)的尋址方式稱(chēng)為寄存器尋址方式。
指令中可以引用的寄存器及其符號(hào)名稱(chēng)如下:
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等。
寄存器尋址方式是一種簡(jiǎn)單快捷的尋址方式,源和目的操作數(shù)都可以是寄存器。
1、源操作數(shù)是寄存器尋址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是雙字,字和字節(jié)類(lèi)型的內(nèi)存變量。在第4章將會(huì)學(xué)到如何定義它們。
2、目的操作數(shù)是寄存器尋址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作數(shù)都是寄存器尋址方式
如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
由于指令所需的操作數(shù)已存儲(chǔ)在寄存器中,或操作的結(jié)果存入寄存器,這樣,在指令執(zhí)行過(guò)程中,會(huì)減少讀/寫(xiě)存儲(chǔ)器單元的次數(shù),所以,使用寄存器尋址方式的指令具有較快的執(zhí)行速度。通常情況下,我們提倡在編寫(xiě)匯編語(yǔ)言程序時(shí),應(yīng)盡可能地使用寄存器尋址方式,但也不要把它絕對(duì)化。
指令所要的操作數(shù)存放在內(nèi)存中,在指令中直接給出該操作數(shù)的有效地址,這種尋址方式為直接尋址方式。
在通常情況下,操作數(shù)存放在數(shù)據(jù)段中,所以,其物理地址將由數(shù)據(jù)段寄存器DS和指令中給出的有效地址直接形成,但如果使用段超越前綴,那么,操作數(shù)可存放在其它段。
例:假設(shè)有指令:MOV BX, [1234H],在執(zhí)行時(shí),(DS)=2000H,內(nèi)存單元21234H的值為5213H。問(wèn)該指令執(zhí)行后,BX的值是什么?
解:根據(jù)直接尋址方式的尋址規(guī)則,把該指令的具體執(zhí)行過(guò)程用下圖來(lái)表示。
從圖中,可看出執(zhí)行該指令要分三部分:
由于1234H是一個(gè)直接地址,它緊跟在指令的操作碼之后,隨取指令而被讀出;
訪(fǎng)問(wèn)數(shù)據(jù)段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存儲(chǔ)單元的物理地址:21234H;
取單元21234H的值5213H,并按“高高低低”的原則存入寄存器BX中。
所以,在執(zhí)行該指令后,BX的值就為5213H。
由于數(shù)據(jù)段的段寄存器默認(rèn)為DS,如果要指定訪(fǎng)問(wèn)其它段內(nèi)的數(shù)據(jù),可在指令中用段前綴的方式顯式地書(shū)寫(xiě)出來(lái)。
下面指令的目標(biāo)操作數(shù)就是帶有段前綴的直接尋址方式。
MOV ES:[1000H], AX
直接尋址方式常用于處理內(nèi)存單元的數(shù)據(jù),其操作數(shù)是內(nèi)存變量的值,該尋址方式可在64K字節(jié)的段內(nèi)進(jìn)行尋址。
注意:立即尋址方式和直接尋址方式的書(shū)寫(xiě)格式的不同,直接尋址的地址要寫(xiě)在括號(hào)“[”,“]”內(nèi)。在程序中,直接地址通常用內(nèi)存變量名來(lái)表示,如:MOV BX, VARW,其中,VARW是內(nèi)存字變量。
試比較下列指令中源操作數(shù)的尋址方式(VARW是內(nèi)存字變量):
MOV AX, 1234H MOV AX, [1234H] ;前者是立即尋址,后者是直接尋址
MOV AX, VARW MOV AX, [VARW] ;兩者是等效的,均為直接尋址
操作數(shù)在存儲(chǔ)器中,操作數(shù)的有效地址用SI、DI、BX和BP等四個(gè)寄存器之一來(lái)指定,稱(chēng)這種尋址方式為寄存器間接尋址方式。該尋址方式物理地址的計(jì)算方法如下:
寄存器間接尋址方式讀取存儲(chǔ)單元的原理如圖所示。
在不使用段超越前綴的情況下,有下列規(guī)定:
若有效地址用SI、DI和BX等之一來(lái)指定,則其缺省的段寄存器為DS;
若有效地址用BP來(lái)指定,則其缺省的段寄存器為SS(即:堆棧段)。
例:假設(shè)有指令:MOV BX,[DI],在執(zhí)行時(shí),(DS)=1000H,(DI)=2345H,存儲(chǔ)單元12345H的內(nèi)容是4354H。問(wèn)執(zhí)行指令后,BX的值是什么?
解:根據(jù)寄存器間接尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),寄存器DI的值不是操作數(shù),而是操作數(shù)的地址。該操作數(shù)的物理地址應(yīng)由DS和DI的值形成,即:
PA=(DS)*16+DI=1000H*16+2345H=12345H。
所以,該指令的執(zhí)行效果是:把從物理地址為12345H開(kāi)始的一個(gè)字的值傳送給BX。
其執(zhí)行過(guò)程如圖所示。
操作數(shù)在存儲(chǔ)器中,其有效地址是一個(gè)基址寄存器(BX、BP)或變址寄存器(SI、D
I)的內(nèi)容和指令中的8位/16位偏移量之和。其有效地址的計(jì)算公式如公式所示。
在不使用段超越前綴的情況下,有下列規(guī)定:
若有效地址用SI、DI和BX等之一來(lái)指定,則其缺省的段寄存器為DS;
若有效地址用BP來(lái)指定,則其缺省的段寄存器為SS。
指令中給出的8位/16位偏移量用補(bǔ)碼表示。在計(jì)算有效地址時(shí),如果偏移量是8位,則進(jìn)行符號(hào)擴(kuò)展成16位。當(dāng)所得的有效地址超過(guò)0FFFFH,則取其64K的模。
例:假設(shè)指令:MOV BX, [SI+100H],在執(zhí)行它時(shí),(DS)=1000H,(SI)=2345H,內(nèi)存單元12445H的內(nèi)容為2715H,問(wèn)該指令執(zhí)行后,BX的值是什么?
解:根據(jù)寄存器相對(duì)尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),源操作數(shù)的有效地址EA為:
EA=(SI)+100H=2345H+100H=2445H
該操作數(shù)的物理地址應(yīng)由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2445H=12445H。
所以,該指令的執(zhí)行效果是:把從物理地址為12445H開(kāi)始的一個(gè)字的值傳送給BX。
其執(zhí)行過(guò)程如圖所示。
操作數(shù)在存儲(chǔ)器中,其有效地址是一個(gè)基址寄存器(BX、BP)和一個(gè)變址寄存器(SI、DI)的內(nèi)容之和。其有效地址的計(jì)算公式如公式所示。
在不使用段超越前綴的情況下,規(guī)定:如果有效地址中含有BP,則缺省的段寄存器為SS;否則,缺省的段寄存器為DS。
例:假設(shè)指令:MOV BX, [BX+SI],在執(zhí)行時(shí),(DS)=1000H,(BX)=2100H,(SI)=0011H,內(nèi)存單元12111H的內(nèi)容為1234H。問(wèn)該指令執(zhí)行后,BX的值是什么?
解:根據(jù)基址加變址尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),源操作數(shù)的有效地址EA為:
EA=(BX)+(SI)=2100H+0011H=2111H
該操作數(shù)的物理地址應(yīng)由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2111H=12111H
所以,該指令的執(zhí)行效果是:把從物理地址為12111H開(kāi)始的一個(gè)字的值傳送給BX。
其執(zhí)行過(guò)程如圖所示。
操作數(shù)在存儲(chǔ)器中,其有效地址是一個(gè)基址寄存器(BX、BP)的值、一個(gè)變址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的計(jì)算公式如公式所示。
在不使用段超越前綴的情況下,規(guī)定:如果有效地址中含有BP,則其缺省的段寄存器為SS;否則,其缺省的段寄存器為DS。
指令中給出的8位/16位偏移量用補(bǔ)碼表示。在計(jì)算有效地址時(shí),如果偏移量是8位,則進(jìn)行符號(hào)擴(kuò)展成16位。當(dāng)所得的有效地址超過(guò)0FFFFH,則取其64K的模。
例:假設(shè)指令:MOV AX, [BX+SI+200H],在執(zhí)行時(shí),(DS)=1000H,(BX)=2100H,(SI)=0010H,內(nèi)存單元12310H的內(nèi)容為1234H。問(wèn)該指令執(zhí)行后,AX的值是什么?
解:根據(jù)相對(duì)基址加變址尋址方式的規(guī)則,在執(zhí)行本例指令時(shí),源操作數(shù)的有效地址EA為:
EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H
該操作數(shù)的物理地址應(yīng)由DS和EA的值形成,即:
PA=(DS)*16+EA=1000H*16+2310H=12310H
所以,該指令的執(zhí)行效果是:把從物理地址為12310H開(kāi)始的一個(gè)字的值傳送給AX。其執(zhí)行過(guò)程如圖所示。
從相對(duì)基址加變址這種尋址方式來(lái)看,由于它的可變因素較多,看起來(lái)就顯得復(fù)雜些,但正因?yàn)槠淇勺円蛩囟?,它的靈活性也就很高。比如:
用D1[i]來(lái)訪(fǎng)問(wèn)一維數(shù)組D1的第i個(gè)元素,它的尋址有一個(gè)自由度,用D2[i][j]來(lái)訪(fǎng)問(wèn)二維數(shù)組D2的第i行、第j列的元素,其尋址有二個(gè)自由度。多一個(gè)可變的量,其尋址方式的靈活度也就相應(yīng)提高了。
相對(duì)基址加變址尋址方式有多種等價(jià)的書(shū)寫(xiě)方式,下面的書(shū)寫(xiě)格式都是正確的,并且其尋址含義也是一致的。
MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX]
但書(shū)寫(xiě)格式BX [1000+SI]和SI[1000H+BX]等是錯(cuò)誤的,即所用寄存器不能在“[“,”]”之外,該限制對(duì)寄存器相對(duì)尋址方式的書(shū)寫(xiě)也同樣起作用。
相對(duì)基址加變址尋址方式是以上7種尋址方式中最復(fù)雜的一種尋址方式,它可變形為其它類(lèi)型的存儲(chǔ)器尋址方式。下表列舉出該尋址方式與其它尋址方式之間的變形關(guān)系。