這一篇我大致概括下計(jì)算機(jī)的尋址方式,因?yàn)樽约涸?a class="innerlink" href="http://ihrv.cn/tags/匯編" title="匯編" target="_blank">匯編上也不是知道很多,所以難免有錯(cuò)誤之處,還希望高手拍磚。希望這一系列文章能為大家學(xué)習(xí)匯編提供一個(gè)平臺(tái)。
首先還是說(shuō)下指令操作數(shù),Intel 8086/8088CPU的指令系統(tǒng)中鎖需操作數(shù)有以下4種:
(1)寄存器操作數(shù):操作數(shù)在CPU的通用寄存器或段寄存器中
(2)立即數(shù)操作數(shù):操作數(shù)在指令中直接給出
(3)存儲(chǔ)器操作數(shù):操作數(shù)在存儲(chǔ)器的存儲(chǔ)單元中
(4)I/O操作數(shù):操作數(shù)在輸入輸出端口的存儲(chǔ)單元中
根據(jù)操作數(shù)來(lái)源不同,將指令尋址方式分為寄存器尋址、立即數(shù)尋址、存儲(chǔ)器尋址和I/O尋址四大類,下面來(lái)細(xì)說(shuō)這四類方式。
一、寄存器尋址
在寄存器尋址方式中,操作數(shù)來(lái)自CPU的某個(gè)/某兩個(gè)通用寄存器中或段寄存器中(CS除外),16位的寄存器操作數(shù)可以是AX、BX、CX、DX、SI、DL、SP、BP、DS、SS和ES,8位寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH。由于存取操作數(shù)就在CPU內(nèi)部進(jìn)行,不需要訪問(wèn)存儲(chǔ)器二執(zhí)行總線周期,所以執(zhí)行速度非???,另外通用寄存器數(shù)目較少,編碼所需的二進(jìn)制位就少,因而使用寄存器尋址可以有效的減少指令寬度。
例如:MOV AX, BX;將寄存器BX中的內(nèi)容傳送給寄存器AX中
若執(zhí)行前AX=1234H, BX=5678H,則指令執(zhí)行完后AX=5678H,BX中內(nèi)容不變。
二、立即數(shù)尋址
在立即數(shù)尋址中指令操作數(shù)直接放在代碼中。它是緊跟在指令操作碼后面的一個(gè)可用的8位或16位二進(jìn)制補(bǔ)碼表示的有符號(hào)數(shù),即操作數(shù)的存放地址是指令操作碼的下一個(gè)單元,這種操作唄成為立即數(shù)。
例如:MOV AX, 1234H立即數(shù)1234H作為源操作數(shù)送入寄存器AX中
指令執(zhí)行后的結(jié)果是寄存器AX的值是1234H
三、存儲(chǔ)器尋址
在存儲(chǔ)器尋址方式下,指令操作數(shù)一般是代碼段以外的數(shù)據(jù)段,堆棧段和附加段中的存儲(chǔ)單元,指令給出的是存儲(chǔ)單元地址或者是存儲(chǔ)單元地址的表達(dá)式。在匯編語(yǔ)言中一個(gè)存儲(chǔ)單元地址都是使用邏輯地址來(lái)表示的。即段基值:偏移量。其中段基值在某個(gè)段寄存器中。偏移量表示了該存儲(chǔ)單元與段基值之間的距離,它是由CPU的執(zhí)行單元EU來(lái)確定和計(jì)算有效地址EA。執(zhí)行指令時(shí),CPU首先根據(jù)操作數(shù)字段提供的地址信息,由執(zhí)行單元EU計(jì)算出有效地址EA,再由總線接口單元BIU根據(jù)公式:物理地址=段基值X16+EA計(jì)算出操作數(shù)的物理地址,有效地址EA由3個(gè)地址分量組合而成:
(1)位移量
(2)基址
(3)變址
一般來(lái)說(shuō),雙操作數(shù)指令的源操作數(shù)和目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù),存儲(chǔ)器尋址方式按EA計(jì)算方式的不同可分為:直接尋址、存儲(chǔ)器間接尋址、基址尋址/變址尋址、基址變址尋址、相對(duì)基址變址尋址和串操作尋址6種。
1.直接尋址
直接尋址時(shí)存儲(chǔ)器尋址中最簡(jiǎn)單的一種,即操作數(shù)的有效地址EA只由位移量組成,即EA=位移量,位移量是直接包含在指令中的,和指令操作碼一起存放在代碼段中,而操作數(shù)則存放在數(shù)據(jù)段中,直接尋址方式不涉及其他寄存器。使用直接尋址的實(shí)例:
MOV BX, VAR ;等價(jià)于MOV BX, DS:VAR
MOV AX, [100H];等價(jià)于MOV AX, DS:[100H]
例如:MOV AX, [1234H];將當(dāng)前數(shù)據(jù)段偏移1234H個(gè)字節(jié)的子存儲(chǔ)單元內(nèi)容傳送給寄存器AX。
設(shè)(DS)=2000H, 那么要訪問(wèn)的子存儲(chǔ)單元的物理地址為2000H*16+1234H=21234H,
如果該字節(jié)的存儲(chǔ)單元的內(nèi)容是5678H,則(AX)=5678H。
2.存儲(chǔ)器間接尋址
在存儲(chǔ)器間接尋址方式中,指令的操作數(shù)在存儲(chǔ)器中,操作數(shù)的有效地址EA不像直接尋址方式那樣直接存放在指令中,而是由基址寄存器BX、BP或變址寄存器SI、DI提供。
如果指令中使用的是BX、SI、DI,則操作數(shù)在數(shù)據(jù)段中,段基值在數(shù)據(jù)段寄存器DS中,則操作數(shù)物理地址為:
物理地址=16*(DS)+(BX)/(SI)/(DI)
如果指令中實(shí)用的是BP,則操作數(shù)在堆棧段中,段基值在堆棧段寄存器SS中,操作數(shù)的物理地址為:
物理地址=16*(SS)+(BP)
3、基址尋址/變址尋址
基址尋址/變址尋址也沒(méi)成為寄存器相對(duì)尋址,其操作數(shù)的有效地址EA是一個(gè)基址寄存器(BX或BP)或者是變址寄存器(SI或DI)的內(nèi)容與指令中制定的一個(gè)8位或16位的位移量之和,即
有效地址EA=(BX)/(BP)/(SI)/(DI)+8位位移量/16位位移量
使用BX/BP尋址時(shí)即成為基址尋址,使用SI/DI時(shí),即成為變址尋址。
如果使用寄存器BX、SI、DI,則隱含使用的段寄存器為DS, 如果使用寄存器BP則隱含的使用堆棧寄存器SS, 若操作數(shù)前指定了段寄存器,那么以指定的段寄存器為準(zhǔn)。即操作數(shù)的物理地址為:
物理地址=16*(DS)+(BX)/(SI)/(DI)+8位位移量/16位位移量
或者 物理地址=16*(SS)+(BP)+8位位移量/16位位移量
使用基址尋址/變址尋址的示例如下:
MOV AL, 10H[BX];等價(jià)于MOV AX, DS:10H[BX]
MOV AL, 20H[SI];等價(jià)于MOV AL, DS:20H[SI]
MOV AH, ES:30H[BX]
例:MOV AX, 10H[BX]
設(shè)(DS)=2000H, (BX)=20H, (20030H)=1234H, 則操作數(shù)的物理地址=16*2000H+10H
+20H=20030H, 執(zhí)行結(jié)果是(AX)=1234H
4、基址變址尋址
基址變址尋址的操作數(shù)有效地址EA是一個(gè)基址寄存器(BX或BP)的內(nèi)容,一個(gè)變址寄存器(SI或DI)的內(nèi)容與指令中制定的一個(gè)8位或16位的位移量之和,即:
有效地址EA=(BX)/(BP)+(SI)/(DI)+8位位移量/16位位移量
如果基址寄存器為BX,那么隱含使用的數(shù)據(jù)段寄存器DS,如果基址寄存器為BP。則隱含使用的是堆棧寄存器SS那么以指定的段寄存器為準(zhǔn),因此,操作數(shù)的物理地址為:
物理地址=16*(DS)+(BX)+(SI)/(DI)+8位位移量/16位位移量
或者 物理地址=16*(SS)+(BP)+(SI)/(DI)+8位位移量/16位位移量
使用基址變址尋址的方式示例如下:
MOV AX, 10H[BX][SI];等價(jià)于MOV AX, DS:10H[BX][SI]
MOV 20H[BP][DI], CX;等價(jià)于MOV SS:20H[BP][DI], CX
前面說(shuō)的幾種存儲(chǔ)器尋址方式中,比如直接尋址、寄存器間接尋址、基址尋址/變址尋址實(shí)際上都是基址變址尋址的特例,位移量可以用常數(shù)表示,也可以用變量表示,位移量可放在方括號(hào)前面,也可放在方括號(hào)中同寄存器一起寫成一個(gè)地址表達(dá)式,例如下面幾種寫法便是等價(jià)的:
MOV VAR[BX][SI], AX
MOV [BX+VAR][SI], AX
MOV [BX][SI+VAR], AX
MOV [BX+SI+VAR], AX
例:MOV AX, 10H[BX][SI]
設(shè)(DS)=2000H, (BX)=1000H, (SI)=3000H, (24010H)=1234H.則
操作數(shù)的物理地址=16*2000H+1000H+3000H+10H=24010H, 執(zhí)行結(jié)果(AX)=1234H
5、串操作尋址
Intel 8086/8088CPU提供了一些專門用于串操作的指令,串操作指令操作數(shù)雖然在存儲(chǔ)器中,但是它們不使用前面我們所說(shuō)的各種尋址方式,而是隱含使用了兩個(gè)變址寄存器SI和DI,串操作指令在尋找源操作數(shù)時(shí),隱含使用SI作為地址指針,源操作數(shù)地址由DS:[SI]提供,尋找目的操作數(shù)時(shí),隱含使用DI作為地址指針,目的操作數(shù)地址由ES:[DI]提供,在每次操作完后,指令將自動(dòng)修改SI和DI的值,使它們指向下一個(gè)單元,指針修改的方向由CF決定,這也就是我在另一篇文章中所說(shuō)的標(biāo)志寄存器(http://yiluohuanghun.blog.51cto.com/3407300/938213)。
四、I/O尋址
I/O指令是CPU與外部設(shè)備進(jìn)行通訊的最基本的途徑,這意味著即使使用DOS功能調(diào)用或BIOS運(yùn)行程序,其例行程序本身也是用I/O指令與外部設(shè)備進(jìn)行數(shù)據(jù)交換的。
1、輸入指令
一般格式為IN AL, PORT
2、輸出指令
一般個(gè)事為OUT PORT, AL
至此為止,我們已經(jīng)把計(jì)算機(jī)的幾種尋址方式一一列舉,希望對(duì)大家有幫助!