《編譯原理》課件第7章_第1頁(yè)
《編譯原理》課件第7章_第2頁(yè)
《編譯原理》課件第7章_第3頁(yè)
《編譯原理》課件第7章_第4頁(yè)
《編譯原理》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章目標(biāo)代碼生成7.1簡(jiǎn)單代碼生成器*7.2匯編指令到機(jī)器代碼翻譯概述習(xí)題七代碼生成是指把語(yǔ)法分析后或者優(yōu)化后的中間代碼(如四元式或三元式)變換成目標(biāo)代碼,所生成的目標(biāo)代碼一般有如下三種形式:

(1)能夠立即執(zhí)行的機(jī)器語(yǔ)言代碼,它們通常放在固定的存儲(chǔ)區(qū)中并可直接執(zhí)行,如PC機(jī)中后綴為?.COM或?.EXE的文件。

(2)待裝配的機(jī)器語(yǔ)言模塊,其地址均為相對(duì)地址,所以不能直接執(zhí)行。當(dāng)需要執(zhí)行時(shí)由連接裝配程序把它們與其它運(yùn)行程序和庫(kù)函數(shù)連接起來(lái),裝配成可執(zhí)行的機(jī)器語(yǔ)言代碼,如PC機(jī)中后綴為?.OBJ的文件都屬于待裝配的模塊(文件)。

(3)匯編語(yǔ)言程序,必須通過(guò)匯編程序的匯編方可轉(zhuǎn)換成可執(zhí)行的機(jī)器語(yǔ)言代碼,如PC機(jī)中后綴為?.ASM的文件即為匯編語(yǔ)言程序。一個(gè)高級(jí)語(yǔ)言程序的目標(biāo)代碼要經(jīng)常、反復(fù)使用,因此代碼生成要著重考慮兩個(gè)問(wèn)題:一是如何使生成的目標(biāo)代碼較短,二是如何充分利用計(jì)算機(jī)的寄存器以減少目標(biāo)代碼中訪問(wèn)存儲(chǔ)單元的次數(shù)。生成的目標(biāo)代碼越短,寄存器的利用越充分,目標(biāo)代碼的質(zhì)量也就越高。設(shè)計(jì)一個(gè)代碼生成器需要考慮具體的機(jī)器結(jié)構(gòu)、指令格式、字長(zhǎng)及寄存器個(gè)數(shù)和種類(lèi),并且與指令的語(yǔ)義和所用的操作系統(tǒng)、存儲(chǔ)管理等都密切相關(guān)。7.1簡(jiǎn)單代碼生成器我們首先介紹一個(gè)簡(jiǎn)單的代碼生成器,此生成器依次把每條中間代碼變換成目標(biāo)代碼,并且在一個(gè)基本塊范圍內(nèi)考慮如何充分利用寄存器的問(wèn)題。一方面,在基本塊中,當(dāng)生成計(jì)算某變量值的目標(biāo)代碼時(shí),盡可能地讓該變量的值保留在寄存器中(即不編出把該變量的值存到內(nèi)存單元的指令),直到該寄存器必須用來(lái)存放其它變量的值或已達(dá)基本塊出口為止;另一方面,后續(xù)的目標(biāo)代碼盡可能地引用變量在寄存器中的值而不訪問(wèn)內(nèi)存。例如,一C語(yǔ)言語(yǔ)句為A=(B+C)*D+E,把它翻譯為四元式G:

T1=B+C T2=T1*D A=T2+E如果不考慮代碼的效率,可以簡(jiǎn)單地把每條中間代碼(四元式)映射成若干條目標(biāo)指令,如將x=y+z映射為

MOVAX,y//AX為寄存器

ADDAX,z MOVx,AX其中,x、y、z均為數(shù)據(jù)區(qū)的內(nèi)存變量。這樣,上述四元式代碼序列G就可翻譯為(1)?MOVAX,B(2)?ADDAX,C(3)?MOVT1,AX(4)?MOVAX,T1

(5)?MULAX,D(6)?MOVT2,AX(7)?MOVAX,T2(8)?ADDAX,E(9)?MOVA,AX雖然從正確性來(lái)看,這種翻譯不存在問(wèn)題,但它卻存在冗余。在上述指令序列中,(4)和(7)兩條指令是多余的;而T1、T2均是中間代碼生成時(shí)產(chǎn)生的臨時(shí)變量,它們?cè)诔隽嘶緣K后將不再使用,故(3)、(6)兩條指令也可刪去。因此,在考慮了效率和充分使用寄存器之后,應(yīng)生成如下代碼:(1)?MOVAX,B(2)?ADDAX,C(3)?MULAX,D(4)?ADDAX,E(5)?MOVA,AX為了實(shí)現(xiàn)這一目的,代碼生成器就必須了解一些信息:在產(chǎn)生T2=T1*D對(duì)應(yīng)的目標(biāo)代碼時(shí),為了省去指令MOVAX,T1,就必須知道T1的當(dāng)前值已在寄存器AX中;為了省去MOVT1,AX,就必須知道出了基本塊后T1不再被引用。7.1.1待用信息與活躍信息在一個(gè)基本塊內(nèi)的目標(biāo)代碼中,為了提高寄存器的使用效率,應(yīng)將基本塊內(nèi)還要被引用的值盡可能地保留在寄存器中,而將基本塊內(nèi)不再被引用的變量所占用的寄存器盡早釋放。每當(dāng)翻譯一條四元式如A=BopC時(shí),需要知道在基本塊中還有哪些四元式要對(duì)變量A、B、C進(jìn)行引用,為此,需要收集一些待用信息。在一個(gè)基本塊中,四元式i對(duì)變量A定值,如果i后面的四元式j(luò)要引用A且從i到j(luò)的四元式?jīng)]有其它對(duì)A的定值點(diǎn),則稱(chēng)j是四元式i中對(duì)變量A的待用信息,同時(shí)也稱(chēng)A是活躍的。如果A被多處引用,則構(gòu)成了A的待用信息鏈與活躍信息鏈。為了取得每個(gè)變量在基本塊內(nèi)的待用信息和活躍信息,可從基本塊的出口由后向前掃描,對(duì)每個(gè)變量建立相應(yīng)的待用信息鏈與活躍信息鏈。如果沒(méi)有進(jìn)行數(shù)據(jù)流分析并且臨時(shí)變量不允許跨基本塊引用,則把基本塊中的臨時(shí)變量均看作基本塊出口之后的非活躍變量,而把所有的非臨時(shí)變量均看作基本塊出口之后的活躍變量。如果某些臨時(shí)變量能夠跨基本塊使用,則把這些臨時(shí)變量也看成基本塊出口之后的活躍變量。假設(shè)變量的符號(hào)表內(nèi)有待用信息和活躍信息欄,則計(jì)算變量待用信息的算法如下:

(1)首先將基本塊中各變量的符號(hào)表的待用信息欄置為“非待用”,對(duì)活躍信息欄則根據(jù)該變量在基本塊出口之后是否活躍而將該欄中的信息置為“活躍”或“非活躍”。

(2)從基本塊出口到基本塊入口由后向前依次處理各四元式。對(duì)每個(gè)四元式i:A=BopC依次執(zhí)行以下步驟:①把符號(hào)表中變量A的待用信息和活躍信息附加到四元式i上;②把符號(hào)表中變量A的待用信息和活躍信息分別置為“非待用”和“非活躍”;③把符號(hào)表中變量B和C的待用信息和活躍信息附加到四元式i上;④把符號(hào)表中變量B和C的待用信息置為i,活躍信息置為“活躍”。注意:以上①~④次序不能顛倒,如果四元式出現(xiàn)A=opB或者A=B形式,則以上執(zhí)行步驟完全相同,只是其中不涉及變量C。例7.1

考察基本塊:

(1)?T=A?B

(2)?U=A?C

(3)?V=T+U

(4)?D=V+U其中,A、B、C、D為變量,T、U、V為中間變量。試求各變量的待用信息鏈和活躍信息鏈。

[解答]我們根據(jù)計(jì)算變量待用信息的算法得到各變量的待用信息鏈和活躍信息鏈如表7.1所示。表中的“F”表示“非待用”或“非活躍”,“L”表示“活躍”,(1)~(4)分別表示基本塊中的四個(gè)四元式。待用信息鏈和活躍信息鏈的每列從左到右為每行從后向前掃描一個(gè)四元式時(shí)相應(yīng)變量的信息變化情況(空白處表示沒(méi)有變化)。待用信息和活躍信息在四元式上的標(biāo)記如下(每個(gè)變量都先去掉待用信息鏈和活躍信息鏈最右的值,然后由右向左依次引用所出現(xiàn)的值):(1)?T(3)L=A(2)L???BFL(2)?U(3)L=AFL???CFL(3)?V(4)L=TFF+U(4)L(4)?DFL=VFF+UFF7.1.2代碼生成算法為了在代碼生成中進(jìn)行寄存器分配,需要隨時(shí)掌握各寄存器的使用情況,即它是處于空閑狀態(tài)還是已分配給某個(gè)變量或已分配給某幾個(gè)變量。通常用一個(gè)寄存器描述數(shù)組RVALUE動(dòng)態(tài)地記錄各寄存器的當(dāng)前狀況,并用寄存器Ri的編號(hào)作為它的下標(biāo)。此外,還需建立一個(gè)變量地址描述數(shù)組AVALUE來(lái)記錄各變量現(xiàn)行值存放的位置,即其是在某寄存器中還是在某內(nèi)存單元中,或者同時(shí)存在于某寄存器和某內(nèi)存單元中,可以有如下表示:RVALUE[Ri]={A} //寄存器Ri分配給變量ARVALUE[Ri]={A,B} //寄存器Ri分配給變量A和BRVALUE[Ri]={} //未分配AVALUE[A]={A} //表示A的值在內(nèi)存中AVALUE[A]={Ri} //表示A的值在寄存器Ri中AVALUE[A]={Ri,A}//表示A的值既在寄存器Ri中又在內(nèi)存中為了簡(jiǎn)單起見(jiàn),假設(shè)基本塊中每個(gè)四元式的形式都是A=BopC,則代碼生成算法是對(duì)每個(gè)四元式i:A=BopC執(zhí)行下述步驟:

(1)調(diào)用函數(shù)GETREG(i:A=BopC)返回存放A值結(jié)果的寄存器R。

(2)通過(guò)地址描述數(shù)組AVALUE[B]和AVALUE[C]確定出變量B和變量C的現(xiàn)行值存放位置B'和C';如果是存放在寄存器中,則把寄存器取作B'和C'。

(3)如果B'≠R,則生成目標(biāo)代碼:

MOVR,B' opR,C'否則生成目標(biāo)代碼:

opR,C'如果B'或C'為R,則刪除AVALUE[B]或AVALUE[C]中的R。

(4)令A(yù)VALUE[A]={R}并令RVALUE[R]={A},表示變量A的現(xiàn)行值只在R中且R中的值只代表A的現(xiàn)行值。

(5)如果B和C的現(xiàn)行值在基本塊中不再被引用,它們也不是基本塊出口之后的活躍變量且它們的現(xiàn)行值存放在寄存器Rk中,則刪除RVALUE[Rk]中的B和C以及AVALUE[B]中的Rk,使寄存器Rk不再為B和C所占用。函數(shù)GETREG(i:A=BopC)用來(lái)得到存放A的當(dāng)前值的寄存器R;其算法如下:

(1)如果B的現(xiàn)行值在某寄存器Ri中,且該寄存器只包含B的值,或者B和A是同一標(biāo)識(shí)符,或者B在該四元式之后不再被引用,則選取Ri為所需寄存器并轉(zhuǎn)(4)。

(2)如有尚未分配的寄存器,則從中選取一個(gè)Ri為所需寄存器并轉(zhuǎn)(4)。

(3)從已分配的寄存器中選取一個(gè)Ri為所需寄存器R。選取原則為:占用Ri的變量的值也同時(shí)放在內(nèi)存中,或者該值在基本塊中要在最遠(yuǎn)的位置才會(huì)引用到。這樣,對(duì)寄存器Ri所含的變量和變量在內(nèi)存中的情況必須先做如下調(diào)整:對(duì)RVALUE[Ri]中的每一個(gè)變量M,如果M不是A或者M(jìn)既是A又是C卻不是B,而B(niǎo)又不在RVALUE[Ri]中,則:①如果AVALUE[Ri]中不包含M,則生成目標(biāo)代碼MOVM,Ri;②當(dāng)M不是A時(shí),如果M是B或者M(jìn)是C且同時(shí)B也在RVALUE[Ri]中,則令A(yù)VALUE[M]={M,R},否則令A(yù)VALUE[M]={M};③刪除RVALUE[Ri]中的M。

(4)給出R,返回。例7.2

對(duì)例7.1,假設(shè)只有AX和BX是可用寄存器,用代碼生成算法生成目標(biāo)代碼及其相應(yīng)的RVALUE和AVALUE。

[解答]用代碼生成算法生成的目標(biāo)代碼及其相應(yīng)的RVALUE和AVALUE,如表7.2所示。對(duì)其它形式的四元式也可仿照上述算法生成其目標(biāo)代碼。這里特別要指出的是,對(duì)形如A=B的復(fù)寫(xiě),如果B的現(xiàn)行值在某寄存器Ri中,那么無(wú)需生成目標(biāo)代碼,只需在RVALUE[Ri]中增加一個(gè)A(即把Ri同時(shí)分配給B和A),把AVALUE[A]改為Ri;而且如果其后B不再被引用,還可把RVALUE[Ri]中的B和AVALUE[B]中的Ri刪除。處理完基本塊中所有的四元式后,對(duì)現(xiàn)行只在某寄存器中的每個(gè)變量,如果它在基本塊出口之后是活躍的,則要用MOV指令把它在寄存器中的值存放到數(shù)據(jù)區(qū)以它命名的內(nèi)存單元中。為進(jìn)行這一工作,我們利用寄存器描述數(shù)組RVALUE來(lái)決定其中哪些變量的現(xiàn)行值在寄存器中,再利用地址描述數(shù)組AVALUE來(lái)決定其中哪些變量的現(xiàn)行值尚不在其內(nèi)存單元中,最后利用活躍變量信息來(lái)決定其中哪些變量是活躍的。例如,由例7.2的表7.2查RVALUE欄可知:U和D的值在寄存器中,而從AVALUE欄知U和D的值都不在內(nèi)存單元中,又由例7.1表7.1知,D在基本塊出口之后是活躍變量,因此,在表7.2所生成的目標(biāo)代碼后面還要生成一條目標(biāo)代碼:

MOVD,AX7.1.3寄存器分配由于寄存器數(shù)量有限,為了生成更有效的目標(biāo)代碼,就必須考慮如何更有效地利用寄存器。為此,我們定義指令的執(zhí)行代價(jià)如下:每條指令的執(zhí)行代價(jià)=每條指令訪問(wèn)內(nèi)存單元次數(shù)+1假定在循環(huán)中,某寄存器固定分配給某變量使用,那么對(duì)循環(huán)中的每個(gè)基本塊,相對(duì)于原簡(jiǎn)單代碼生成算法所生成的目標(biāo)代碼,所節(jié)省的執(zhí)行代價(jià)可用下述方法計(jì)算:

(1)在原代碼生成算法中,僅當(dāng)變量在基本塊中被定值時(shí),其值才存放在寄存器中?,F(xiàn)在把寄存器固定分配給某變量使用,在該變量在基本塊中被定值前,每引用它一次就可以少訪問(wèn)一次內(nèi)存,則執(zhí)行代價(jià)節(jié)省1。

(2)在原代碼生成算法中,如果某變量在基本塊中被定值且在基本塊出口之后是活躍的,則出基本塊時(shí)要把它在寄存器中的值存放到內(nèi)存單元中?,F(xiàn)在把寄存器固定分配給某變量使用,出基本塊時(shí)就無(wú)需把它的值存放到其內(nèi)存單元中,則執(zhí)行代價(jià)節(jié)省2。 因此,對(duì)循環(huán)L中的變量M,如果分配一個(gè)寄存器給它專(zhuān)用,那么每執(zhí)行循環(huán)一次,其執(zhí)行代價(jià)的節(jié)省數(shù)可用下式計(jì)算:其中,USE(M,B)=基本塊B中對(duì)M定值前引用M的次數(shù)

1如果M在基本塊B中被定值且在B的出口之后是活躍的

0其它情況LIVE(M,B)例7.3

一代碼序列及程序流圖如圖7–1所示。假定各基本塊出口之后的活躍變量均為a、b、c,循環(huán)中的固定寄存器為AX、BX,則將AX、BX固定分配給循環(huán)中哪兩個(gè)變量可使執(zhí)行代價(jià)節(jié)省得最多?圖7–1例7.3的程序流圖

[解答](1)考慮變量a的情況:基本塊B2中沒(méi)有對(duì)a進(jìn)行定值,且引用的次數(shù)為1(e=a?b);基本塊B3沒(méi)有對(duì)a進(jìn)行定值,也沒(méi)有引用a;基本塊B4對(duì)a進(jìn)行了定值,并且定值前引用的次數(shù)為1(a=a?f)。根據(jù)執(zhí)行代價(jià)節(jié)省數(shù)的計(jì)算公式得到:USE(a,B2)=1;LIVE(a,B2)=0;USE(a,B3)=0;LIVE(a,B3)=0;USE(a,B4)=1;LIVE(a,B4)=1;因此,變量a在一次循環(huán)中執(zhí)行代價(jià)的節(jié)省總數(shù)為 ∑[USE(a,B)+2*LIVE(a,B)]=1+0+1+2*(0+0+1)=4

B∈L

(2)對(duì)于變量b有:USE(b,B2)=2;LIVE(b,B2)=1;USE(b,B3)=1;LIVE(b,B3)=1;USE(b,B4)=0;LIVE(b,B4)=0;因此,變量b在一次循環(huán)中執(zhí)行代價(jià)的節(jié)省總數(shù)為∑[USE(b,B)+2*LIVE(b,B)]=2+1+0+2*(1+1+0)=7B∈L

(3)對(duì)于變量c有:USE(c,B2)=2;LIVE(c,B2)=1;USE(c,B3)=1;LIVE(c,B3)=0;USE(c,B4)=1;LIVE(c,B4)=0;因此,變量c在一次循環(huán)中執(zhí)行代價(jià)的節(jié)省總數(shù)為∑[USE(c,B)+2*LIVE(c,B)]=2+1+1+2*(1+0+0)=6B∈L7.1.4源程序到目標(biāo)代碼生成示例我們以PC機(jī)的匯編語(yǔ)言作為目標(biāo)代碼,且假定可用的寄存器為AX、BX、CX和DX,則一C語(yǔ)言源程序轉(zhuǎn)換為四元式代碼序列,然后再轉(zhuǎn)換為目標(biāo)代碼程序(轉(zhuǎn)換中不考慮優(yōu)化)的結(jié)果如下:(1)?C語(yǔ)言源程序(局部):while(a>b){if(m>=n)a=a+1;else

while(k==h)

x=x+2;m=n+x*(m+y);}

(2)四元式代碼序列:100(j>,a,b,102)101(j,_,_,117)102(j>=,m,n,104)103(j,_,_,107)104(+,a,1,T1)105(=,T1,_,a)106(j,_,_,112)107(j=,k,h,109)108(j,_,_,112)109(+,x,2,T2)110(=,T2,_,x)111(j,_,_,107)112(+,m,y,T3)113(*,x,T3,T4)114(+,n,T4,T5)115(=,T5,_,m)116(j,_,_,100)

(3)目標(biāo)代碼程序?(匯編語(yǔ)言程序):

;File:compile.asm

;************************************

datasegment;定義數(shù)據(jù)段

h DW

k

DW

m DW

n DW

x DW

y DW

a DW

b DW

dataends;數(shù)據(jù)段定義結(jié)束

;************************************codesegment ;

定義代碼段mainprocfar ;

程序的執(zhí)行部分assumcs:code,ds:datastart:pushdssubbx,bxpushbxmovbx,data ;設(shè)置DS段為當(dāng)前數(shù)據(jù)段movds,bx;語(yǔ)句翻譯由此開(kāi)始:100:movAX,acmpAX,bjg102101:mp117102:movAX,mcmpAX,njge104103:jmp107104:movAX,aaddAX,1D105:movBX,AXmova,BX;跳出基本塊前保存寄存器中已改變的變量值106:jmp112107:movAX,kcmpAX,hje109108:jmp112109:movAX,xaddAX,2D110:movBX,AXmovx,BX;跳出基本塊前保存寄存器中已改變的變量值111:jmp107112:movAX,maddAX,y113:mulx114:movBX,naddBX,AX115:movCX,BXmovm,CX

;跳出基本塊前保存寄存器中已改變的變量值116:jmp100117:retmainendpcodeends ;代碼段定義結(jié)束

endstart*7.2匯編指令到機(jī)器代碼翻譯概述

雖然我們已經(jīng)在“微機(jī)原理”或“匯編語(yǔ)言程序設(shè)計(jì)”課程中學(xué)習(xí)了8086/8088指令系統(tǒng),但那是從掌握匯編語(yǔ)言和微機(jī)原理及使用的角度來(lái)學(xué)習(xí)指令系統(tǒng)的?,F(xiàn)在,我們從編譯的角度來(lái)深入了解8086/8088指令系統(tǒng)的設(shè)計(jì)特點(diǎn)及實(shí)現(xiàn)方法。

8086/8088指令系統(tǒng)的編碼格式非常緊湊并且靈活,其機(jī)器碼指令長(zhǎng)度為1~6個(gè)字節(jié)(不包括前綴)。通常指令的第一字節(jié)為操作碼,用以規(guī)定操作的類(lèi)型;第二字節(jié)規(guī)定操作數(shù)的尋址方式。典型的單操作數(shù)指令結(jié)構(gòu)如圖7–2所示。圖7–2典型的單操作數(shù)指令結(jié)構(gòu)(a)操作數(shù)在16位寄存器內(nèi);(b)操作數(shù)在寄存器或存儲(chǔ)器內(nèi)典型的雙操作數(shù)指令結(jié)構(gòu)如圖7–3所示。圖7–3典型的雙操作數(shù)指令結(jié)構(gòu)其中,reg表示寄存器尋址代碼;mod表示尋址方式代碼;r/m表示寄存器或存儲(chǔ)器尋址方式(與mod字段組合決定);d位表示指示操作數(shù)的傳送方向,用于雙操作數(shù)指令;w位表示字操作標(biāo)志位。d=0時(shí),reg字段為源操作數(shù),r/m和mod字段為目的操作數(shù);d=1時(shí),r/m和mod字段為源操作數(shù),reg字段為目的操作數(shù)。w=0是字節(jié)操作指令;w=1是字操作指令。由于雙操作數(shù)指令只有一個(gè)w位,因此,兩個(gè)操作數(shù)要么都是8位,要么都是16位。然而,對(duì)于值很小的立即數(shù)操作來(lái)說(shuō),如果用16位表示就有些浪費(fèi)存儲(chǔ)空間了。為了減少這種情況下立即數(shù)所占用的字節(jié)數(shù),8086/8088指令系統(tǒng)對(duì)諸如加法、減法和比較的立即數(shù)操作指令設(shè)置了符號(hào)擴(kuò)展位s。s位只對(duì)16位操作數(shù)(w=1)有效,即:這樣對(duì)一些16位立即數(shù)操作指令,立即數(shù)的存儲(chǔ)僅是8位的,節(jié)省了存儲(chǔ)空間和取指時(shí)間,只是當(dāng)CPU執(zhí)行該操作時(shí)再將立即數(shù)擴(kuò)展為16位。

8086/8088指令格式主要由操作碼域和操作數(shù)域構(gòu)成。操作碼域指出了該指令操作的類(lèi)型,操作碼域中的d、w位(如果有的話)隨傳送方向及字還是字節(jié)操作而變化,少量指令存在著第二操作碼。8086/8088指令格式設(shè)計(jì)的精妙之處在于操作數(shù)域,根據(jù)尋址方式、傳送方向(d位)、字或字節(jié)操作(w位)決定了第二字節(jié)(尋址方式字節(jié))中mod字段、r/m字段以及reg字段的取值及該條指令機(jī)器碼的長(zhǎng)度(須特別注意機(jī)器碼長(zhǎng)度的確定)。由mod和r/m字段組合共同決定一個(gè)操作數(shù)的尋址方式及有效地址的計(jì)算方法見(jiàn)表7.3。由reg字段規(guī)定的寄存器或段寄存器編碼見(jiàn)表7.4。

有了表7.3和表7.4,我們就可以根據(jù)傳送方向位d、字或字節(jié)操作位w的值以及所要求的尋址方式及參加操作的寄存器或存儲(chǔ)器地址來(lái)構(gòu)造由mod、r/m和reg字段組成的尋址方式字節(jié)并形成屬于操作數(shù)域的其后各字節(jié)內(nèi)容。例如,數(shù)據(jù)傳送類(lèi)指令MOV所允許出現(xiàn)的指令格式有:如果指令完成寄存器與存儲(chǔ)器之間的傳送操作,例如:MOVAX,[BX+DI+1234H],則對(duì)應(yīng)的機(jī)器指令只能有一種形式。這是因?yàn)閞eg段只能表示寄存器而無(wú)法表示存儲(chǔ)器,而mod和r/m字段的組合根據(jù)mod域值既可以表示寄存器又可以表示存儲(chǔ)器,故當(dāng)操作數(shù)的一方是存儲(chǔ)器時(shí)就只能用mod和r/m字段來(lái)表示了。究竟是將寄存器的內(nèi)容傳送到存儲(chǔ)器還是將存儲(chǔ)器的內(nèi)容傳送到寄存器,這取決于傳送方向位d的值。本條指令的存儲(chǔ)器地址通過(guò)查找表7.3可知,mod值為10,r/m值為001;而由表7.4得知reg所對(duì)應(yīng)的操作數(shù)AX值為000,并且d位值必須為1才能保證將mod和r/m指定的內(nèi)容送AX,所以此時(shí)該指令對(duì)應(yīng)的機(jī)器碼為注意:mod取值10是因?yàn)樵撝噶畹拇鎯?chǔ)器操作數(shù)中還帶有16位位移1234H,即在操作碼字節(jié)及尋址字節(jié)之后帶有16位的位移量,低8位值為34H,高8位為12H。由

mod=10可知,存儲(chǔ)器操作數(shù)還帶有16位位移量,這個(gè)16位位移量是緊隨在機(jī)器碼第二字節(jié)即尋址方式字節(jié)之后的,所以位移量必須插到立即數(shù)之前,以便形成存儲(chǔ)器的有效地址。注意,此時(shí)的機(jī)器碼指令長(zhǎng)度為6個(gè)字節(jié),這是8086/8088指令系統(tǒng)中最長(zhǎng)的機(jī)器碼指令形式。通過(guò)機(jī)器碼指令的形成過(guò)程可知,機(jī)器碼指令的長(zhǎng)度是由字或字節(jié)操作以及尋址方式?jīng)Q定的。這一點(diǎn)對(duì)編譯來(lái)說(shuō)很重要,因?yàn)樵诰幾g過(guò)程中必須根據(jù)源指令來(lái)確定形成的機(jī)器碼指令所應(yīng)具有的字節(jié)數(shù)(即長(zhǎng)度)。由8086/8088指令系統(tǒng)的尋址方式和機(jī)器碼指令的尋址方式字節(jié)即mod、r/m和reg字段可以看出:雙操作數(shù)指令允許寄存器與寄存器、寄存器與存儲(chǔ)器之間進(jìn)行操作,此外還允許立即數(shù)到寄存器/存儲(chǔ)器的操作;但無(wú)法用mod、r/m和reg字段來(lái)同時(shí)表示兩個(gè)存儲(chǔ)器的地址。如果允許存儲(chǔ)器到存儲(chǔ)器操作的指令出現(xiàn),則將會(huì)使機(jī)器碼指令變得更長(zhǎng)、更復(fù)雜。故此,8086/8088舍去了直接進(jìn)行存儲(chǔ)器之間操作的指令,使得機(jī)器指令更加簡(jiǎn)潔有效。如果要實(shí)現(xiàn)存儲(chǔ)器到存儲(chǔ)器的操作,只需經(jīng)過(guò)寄存器過(guò)渡:先進(jìn)行存儲(chǔ)器到寄存器的操作,并將結(jié)果保存在寄存器中,然后再使用一條由寄存器傳送到存儲(chǔ)器的指令操作即可。

習(xí)題七7.1完成下列選擇題:(1)評(píng)價(jià)一個(gè)代碼生成器最重要的指標(biāo)是。

A.代碼的正確性

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論