編譯原理 第7章 目標(biāo)代碼生成.ppt_第1頁
編譯原理 第7章 目標(biāo)代碼生成.ppt_第2頁
編譯原理 第7章 目標(biāo)代碼生成.ppt_第3頁
編譯原理 第7章 目標(biāo)代碼生成.ppt_第4頁
編譯原理 第7章 目標(biāo)代碼生成.ppt_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 目標(biāo)代碼生成,7.1 一個簡單代碼生成器 7.2 匯編指令到機器代碼的翻譯概述,7.1 一個簡單代碼生成器,我們首先介紹一個簡單的代碼生成器,此生成器依次把每條中間代碼變換成目標(biāo)代碼,并且在一個基本塊范圍內(nèi)考慮如何充分利用寄存器的問題。一方面,在基本塊中,當(dāng)生成計算某變量值的目標(biāo)代碼時,盡可能地讓該變量的值保留在寄存器中(即不編出把該變量的值存到內(nèi)存單元的指令),直到該寄存器必須用來存放其它變量的值或已達(dá)基本塊出口為止;另一方面,后續(xù)的目標(biāo)代碼盡可能地引用變量在寄存器中的值而不訪問內(nèi)存。,例如,一C語言語句為A=(B+C)*D+E,把它翻譯為四元式G: T1=B+C T2=T1*D A

2、=T2+E 如果不考慮代碼的效率,可以簡單地把每條中間代碼(四元式)映射成若干條目標(biāo)指令,如將x=y+z映射為: MOV AX, y /*AX為寄存器*/ ADD AX, z MOV x, AX,其中,x、y、z均為數(shù)據(jù)區(qū)的內(nèi)存變量。 這樣,上述四元式代碼序列G就可翻譯為: (1) MOV AX, B (2) ADD AX, C (3) MOV T1, AX (4) MOV AX, T1 (5) MUL AX, D (6) MOV T2, AX (7) MOV AX, T2 (8) ADD AX, E (9) MOV A, AX,雖然從正確性來看,這種翻譯不存在問題,但它卻存在冗余。在上述指令

3、序列中,(4)和(7)兩條指令是多余的;而T1、T2均是中間代碼生成時產(chǎn)生的臨時變量,它們在出了基本塊后將不再使用,故(3)、(6)兩條指令也可刪去。所以,在考慮了效率和充分使用寄存器之后,應(yīng)生成如下代碼:,(1) MOV AX, B (2) ADD AX, C (3) MUL AX, D (4) ADD AX, E (5) MOV A, AX,為了實現(xiàn)這一目的,代碼生成器就必須了解一些信息:在產(chǎn)生T2=T1*D對應(yīng)的目標(biāo)代碼時,為了省去指令MOV AX, T1,就必須知道T1的當(dāng)前值已在寄存器AX中;為了省去MOV T1, AX,就必須知道出了基本塊后T1不再被引用。,7.1.1 待用信息與

4、活躍信息 在一個基本塊內(nèi)的目標(biāo)代碼中,為了提高寄存器的使用效率,應(yīng)將基本塊內(nèi)還要被引用的值盡可能地保留在寄存器中,而將基本塊內(nèi)不再被引用的變量所占用的寄存器盡早釋放。每當(dāng)翻譯一條四元式如A=B op C時,需要知道在基本塊中還有哪些四元式要對變量A、B、C進(jìn)行引用,為此,需要收集一些待用信息。在一個基本塊中,四元式i對變量A定值,如果i后面的四元式j(luò)要引用A且從i到j(luò)的四元式?jīng)]有其它對A的定值點,則稱j是四元式i中對變量A的待用信息,同時也稱A是活躍的;如果A被多處引用,則構(gòu)成了A的待用信息鏈與活躍信息鏈。,為了取得每個變量在基本塊內(nèi)的待用信息和活躍信息,可從基本塊的出口由后向前掃描,對每個變

5、量建立相應(yīng)的待用信息鏈與活躍信息鏈。如果沒有進(jìn)行數(shù)據(jù)流分析并且臨時變量不允許跨基本塊引用,則把基本塊中的臨時變量均看作基本塊出口之后的非活躍變量,而把所有的非臨時變量均看作基本塊出口之后的活躍變量。如果某些臨時變量能夠跨基本塊使用,則把這些臨時變量也看成基本塊出口之后的活躍變量。 假設(shè)變量的符號表內(nèi)有待用信息和活躍信息欄,則計算變量待用信息的算法如下:,(1) 首先將基本塊中各變量的符號表的待用信息欄置為“非待用”,對活躍信息欄則根據(jù)該變量在基本塊出口之后是否活躍而將該欄中的信息置為“活躍”或“非活躍”。 (2) 從基本塊出口到基本塊入口由后向前依次處理各四元式。對每個四元式i:A=B op

6、C依次執(zhí)行以下步驟:, 把符號表中變量A的待用信息和活躍信息附加到四元式i上; 把符號表中變量A的待用信息和活躍信息分別置為“非待用”和“非活躍”; 把符號表中變量B和C的待用信息和活躍信息附加到四元式i上; 把符號表中B和C的待用信息置為i,活躍信息置為“活躍”。,例7.1 考察基本塊: (1) T=AB (2) U=AC (3) V=T+U (4) D=V+U 其中,A、B、C、D為變量,T、U、V為中間變量,試求各變量的待用信息鏈和活躍信息鏈。,解答 我們根據(jù)計算變量待用信息的算法得到各變量的待用信息鏈和活躍信息鏈如表7.1所示。表中的“F”表示“非待用”或“非活躍”,“L”表示“活躍”

7、,(1)(4)分別表示基本塊中的四個四元式。待用信息鏈和活躍信息鏈的每列從左到右為每行從后向前掃描一個四元式時相應(yīng)變量的信息變化情況(空白處表示沒有變化)。,表7.1 例7.1的待用信息鏈和活躍信息鏈,待用信息和活躍信息在四元式上的標(biāo)記如下: (1) T(3)L=A(2)LBFL (2) U(3)L=AFLCFL (3) V(4)L=TFF+U(4)L (4) DFL=VFF+UFF,7.1.2 代碼生成算法 為了在代碼生成中進(jìn)行寄存器分配,需要隨時掌握各寄存器的使用情況,即它是處于空閑狀態(tài)還是已分配給某個變量或已分配給某幾個變量。通常用一個寄存器描述數(shù)組RVALUE動態(tài)地記錄各寄存器的當(dāng)前狀

8、況,并用寄存器Ri的編號作為它的下標(biāo)。此外,還需建立一個變量地址描述數(shù)組AVALUE來記錄各變量現(xiàn)行值存放的位置,即其是在某寄存器中還是在某內(nèi)存單元中,或者同時存在于某寄存器和某內(nèi)存單元中,可以有如下表示:,RVALUERi=A /*寄存器Ri分配給變量A*/ RVALUERi=A,B /*寄存器Ri分配給變量A和B*/ RVALUERi= /*未分配*/ AVALUEA=A /*表示A的值在內(nèi)存中*/ AVALUEA=Ri /*表示A的值在寄存器Ri中*/ AVALUEA= Ri ,A /*表示A的值既在寄存器Ri中又在內(nèi)存中*/,為了簡單起見,假設(shè)基本塊中每個四元式的形式都是A=B op

9、C,則代碼生成算法是對每個四元式i:A=B op C執(zhí)行下述步驟: (1) 調(diào)用函數(shù)GETREG (i:A=B op C)返回存放A值結(jié)果的寄存器R。 (2) 通過地址描述數(shù)組AVALUE B和AVALUE C確定出變量B和變量C的現(xiàn)行值存放位置B和C;如果是存放在寄存器中,則把寄存器取作B和C。,(3) 如果BR,則生成目標(biāo)代碼: MOV R, B op R, C 否則生成目標(biāo)代碼: op R, C 如果B或C為R,則刪除AVALUE B或AVALUE C中的R。 (4) 令A(yù)VALUEA=R并令RVALUER=A,表示變量A的現(xiàn)行值只在R中且R中的值只代表A的現(xiàn)行值。,(5) 如果B和C的

10、現(xiàn)行值在基本塊中不再被引用,它們也不是基本塊出口之后的活躍變量且它們的現(xiàn)行值存放在寄存器Rk中,則刪除RVALUE Rk中的B和C以及AVALUE B中的Rk,使寄存器Rk不再為B和C所占用。 函數(shù)GETREG(i:A=B op C)用來得到存放A的當(dāng)前值的寄存器R;其算法如下: (1) 如果B的現(xiàn)行值在某寄存器Ri中,且該寄存器只包含B的值,或者B和A是同一標(biāo)識符,或者B在該四元式之后不再被引用,則選取Ri為所需寄存器并轉(zhuǎn)(4)。,(2) 如有尚未分配的寄存器,則從中選取一個Ri為所需寄存器并轉(zhuǎn)(4)。 (3) 從已分配的寄存器中選取一個Ri為所需寄存器R。選取原則為:占用Ri的變量的值也同

11、時放在內(nèi)存中,或者該值在基本塊中要在最遠(yuǎn)的位置才會引用到。這樣,對寄存器Ri所含的變量和變量在內(nèi)存中的情況必須先做如下調(diào)整: 對RVALUE Ri中的每一個變量M,如果M不是A或者M(jìn)既是A又是C卻不是B,而B又不在RVALUE Ri中,則: 如果AVALUE Ri中不包含M,則生成目標(biāo)代碼MOV M, Ri ;, 當(dāng)M不是A時,如果M是B或者M(jìn)是C且同時B也在RVALUE Ri中,則令A(yù)VALUE M=M,R,否則令A(yù)VALUE M=M; 刪除RVALUE Ri中的M; (4) 給出R,返回。 例7.2 對例7.1,假設(shè)只有AX和BX是可用寄存器,用代碼生成算法生成目標(biāo)代碼和相應(yīng)的RVALUE

12、和AVALUE。 解答 用代碼生成算法生成的目標(biāo)代碼和相應(yīng)的RVALUE及AVALUE如表7.2所示。,表7.2 例7.2的目標(biāo)代碼,對其它形式的四元式也可仿照上述算法生成其目標(biāo)代碼。這里特別要指出的是,對形如A=B的復(fù)寫,如果B的現(xiàn)行值在某寄存器Ri中,那么無需生成目標(biāo)代碼,只需在RVALUE Ri中增加一個A(即把Ri同時分配給B和A),把AVALUE A改為Ri;而且如果其后B不再被引用,還可把RVALUE Ri中的B和AVALUE B中的Ri刪除。 處理完基本塊中所有的四元式后,對現(xiàn)行只在某寄存器中的每個變量,如果它在基本塊出口之后是活躍的,則要用MOV指令把它在寄存器中的值存放到數(shù)據(jù)

13、區(qū)以它命名的內(nèi)存單元中。,為進(jìn)行這一工作,我們利用寄存器描述數(shù)組RVALUE來決定其中哪些變量的現(xiàn)行值在寄存器中,再利用地址描述數(shù)組AVALUE來決定其中哪些變量的現(xiàn)行值尚不在其內(nèi)存單元中,最后利用活躍變量信息來決定其中哪些變量是活躍的。例如,由例7.2的表7.2查RVALUE欄可知:U和D的值在寄存器中,而從AVALUE欄知U和D的值都不在內(nèi)存單元中,又由例7.1表7.1知,D在基本塊出口之后是活躍變量,所以,在表7.2所生成的目標(biāo)代碼后面還要生成一條目標(biāo)代碼: MOV D, AX,7.1.3 寄存器分配 由于寄存器數(shù)量有限,為了生成更有效的目標(biāo)代碼,就必須考慮如何更有效地利用寄存器。為此,

14、我們定義指令的執(zhí)行代價如下: 每條指令的執(zhí)行代價=每條指令訪問內(nèi)存單元次數(shù)+1 假定在循環(huán)中,某寄存器固定分配給某變量使用,那么對循環(huán)中的每個基本塊,相對于原簡單代碼生成算法所生成的目標(biāo)代碼,所節(jié)省的執(zhí)行代價可用下述方法計算:,(1) 在原代碼生成算法中,僅當(dāng)變量在基本塊中被定值時,其值才存放在寄存器中?,F(xiàn)在把寄存器固定分配給某變量使用,當(dāng)該變量在基本塊中被定值前,每引用它一次就可以少訪問一次內(nèi)存,則執(zhí)行代價節(jié)省1。 (2) 在原代碼生成算法中,如果某變量在基本塊中被定值且在基本塊出口之后是活躍的,則出基本塊時要把它在寄存器中的值存放到內(nèi)存單元中?,F(xiàn)在把寄存器固定分配給某變量使用,出基本塊時就

15、無需把它的值存放到其內(nèi)存單元中,則執(zhí)行代價節(jié)省2。,因此,對循環(huán)L中的變量M,如果分配一個寄存器給它專用,那么每執(zhí)行循環(huán)一次,其執(zhí)行代價的節(jié)省數(shù)可用下式計算: 其中, USE(M, B)=基本塊B中對M定值前引用M的次數(shù) 1 如果M在基本塊B中被定值且在B的出口之后是活躍的 LIVE(M,B)= 0 其它情況,例7.3 一代碼序列及程序流圖如圖71所示。假定各基本塊出口之后的活躍變量均為a、b、c,循環(huán)中的固定寄存器為AX、BX,則將AX、BX固定分配給循環(huán)中哪兩個變量可使執(zhí)行代價節(jié)省得最多?,圖71 程序流圖,解答 (1) 考慮變量a的情況:基本塊B2中沒有對a進(jìn)行定值,且引用的次數(shù)為1(e

16、=ab);基本塊B3沒有對a進(jìn)行定值,也沒有引用a;基本塊B4對a進(jìn)行了定值,并且定值前引用的次數(shù)為1(a=af)。根據(jù)執(zhí)行代價節(jié)省數(shù)的計算公式得到: 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é)省總數(shù)為:,USE(a,B)+2*LIVE(a,B) BL,=1+0+1+2*(0+0+1)=4,(2) 對于變量b有: USE(b,B2)=2; LIVE(b,B2)=1; USE(b,B3)=1; LIVE(b,B3)=1; USE(b,B4)=

17、0; LIVE(b,B4)=0; 因此,變量b在一次循環(huán)中執(zhí)行代價的節(jié)省總數(shù)為:,USE(b,B)+2*LIVE(b,B) BL,=2+1+0+2*(1+1+0)=7,(3) 對于變量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é)省總數(shù)為:,USE(c,B)+2*LIVE(c,B) BL,=2+1+1+2*(1+0+0)=6,7.1.4 源程序到目標(biāo)代碼生成示例 我們以PC機的匯編語言作為目標(biāo)代碼,且假定可用的寄存器為AX、BX、CX和

18、DX,則一C語言源程序轉(zhuǎn)換為四元式代碼序列,然后再轉(zhuǎn)換為目標(biāo)代碼程序(轉(zhuǎn)換中不考慮優(yōu)化)的結(jié)果如下:,(1) C語言源程序(局部) while (ab) 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 )

19、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)代碼程序(匯編語言程序) ; File: compile.asm ; * data segment ; 定義數(shù)據(jù)段 h DW k DW m DW n DW x DW,y DW a DW b DW data ends ; 數(shù)據(jù)段定義結(jié)束

20、 ; * code segment ; 定義代碼段 main proc far ; 程序的執(zhí)行部分 assum cs:code, ds:data,start: push ds sub bx, bx push bx mov bx, data ; 設(shè)置DS段為當(dāng)前數(shù)據(jù)段 mov ds, bx ; 語句翻譯由此開始: 100: mov AX, a cmp AX, b jg 102,101: mp 117 102: mov AX, m cmp AX, n jge 104 103: jmp 107 104: mov AX, a add AX, 1D 105: mov BX, AX mov a, BX ;

21、 跳出基本塊前保存寄存器中已改變的變量值 106: jmp 112,107: mov AX, k cmp AX, h je 109 108: jmp 112 109: mov AX, x add AX, 2D 110: mov BX, AX mov x, BX ; 跳出基本塊前保存寄存器中已改變的變量值 111: jmp 107 112: mov AX, m,add AX, y 113: mul x 114: mov BX, n add BX, AX 115: mov CX, BX mov m, CX ; 跳出基本塊前保存寄存器中已改變的變量值 116: jmp 100 117: ret ma

22、in endp,code ends ; 代碼段定義結(jié)束 end start,*7.2 匯編指令到機器代碼的翻譯概述,雖然我們已經(jīng)在微機原理或匯編語言程序設(shè)計課程中學(xué)習(xí)了8086/8088指令系統(tǒng),但那是從掌握匯編語言和微機的原理及使用的角度來學(xué)習(xí)指令系統(tǒng)的?,F(xiàn)在,我們從編譯的角度來深入了解8086/8088指令系統(tǒng)的設(shè)計特點及實現(xiàn)方法。,8086/8088指令系統(tǒng)的編碼格式非常緊湊并且靈活,其機器碼指令長度為16個字節(jié)(不包括前綴),通常指令的第一字節(jié)為操作碼,用以規(guī)定操作的類型;第二字節(jié)規(guī)定操作數(shù)的尋址方式。 典型的單操作數(shù)指令結(jié)構(gòu)如圖72所示。,圖72 典型的單操作數(shù)指令,典型的雙操作數(shù)指

23、令結(jié)構(gòu)如圖73所示。,圖73 典型的雙操作數(shù)指令,其中,reg表示寄存器尋址代碼;mod表示尋址方式代碼;r/m表示寄存器或存儲器尋址方式(與mod字段組合決定);d位表示指示操作數(shù)的傳送方向,用于雙操作數(shù)指令;w位表示字操作標(biāo)志位。d=0時,reg字段為源操作數(shù),r/m和mod字段為目的操作數(shù);d=1時,r/m和mod字段為源操作數(shù),reg字段為目的操作數(shù)。w=0是字節(jié)操作指令;w=1是字操作指令。,由于雙操作數(shù)指令只有一個w位,因此,兩個操作數(shù)要么都是8位,要么都是16位。然而,對于值很小的立即數(shù)操作來說,如果用16位表示就有些浪費存儲空間了。為了減少這種情況下立即數(shù)所占用的字節(jié)數(shù),808

24、6/8088指令系統(tǒng)對諸如加法、減法和比較的立即數(shù)操作指令設(shè)置了符號擴展位s,s位只對16位操作數(shù)(w=1)有效,即: 01 16位(字)操作,不進(jìn)行符號擴展 11 16位(字)操作,但立即數(shù)僅給出低8位,應(yīng)進(jìn)行符號擴展,sw=,這樣對一些16位立即數(shù)操作指令,立即數(shù)的存儲僅是8位的,節(jié)省了存儲空間和取指時間,只是當(dāng)CPU執(zhí)行該操作時再將立即數(shù)擴展為16位。 8086/8088指令格式主要由操作碼域和操作數(shù)域構(gòu)成。操作碼域指出了該指令操作的類型,操作碼域中的d、w位(如果有的話)隨傳送方向及字還是字節(jié)操作而變化,少量指令存在著第二操作碼。8086/8088指令格式設(shè)計的精妙之處在于操作數(shù)域,根

25、據(jù)尋址方式、傳送方向(d位) 、字或字節(jié)操作(w位)決定了第二字節(jié)(尋址方式字節(jié))中mod字段、r/m字段以及reg字段的取值及該條指令機器碼的長度(須特別注意機器碼長度的確定)。,表7.3 尋址方式表,表7.4 寄存器表,有了表7.3和表7.4,我們就可以根據(jù)傳送方向位d、字或字節(jié)操作位w的值以及所要求的尋址方式及參加操作的寄存器或存儲器地址來構(gòu)造由mod、r/m和reg字段組成的尋址方式字節(jié)并形成屬于操作數(shù)域的其后各字節(jié)內(nèi)容。例如,數(shù)據(jù)傳送類指令MOV所允許出現(xiàn)的指令格式有: (1) 寄存器/存儲器 寄存器:,1 0 0 0 1 0 d w mod reg r/m,(2) 立即數(shù) 寄存器/

26、存儲器:,1 1 1 0 0 0 1 w mod 000 r/m data data if w=1,(3) 立即數(shù) 寄存器:,1 0 1 1 w reg data data if w=1,(4) 存儲器 累加器:,1 0 1 0 0 0 d w addrlow addrhight,(5) 累加器 存儲器:,1 0 1 0 0 0 1 w addrlow addrhight,(6) 寄存器/存儲器 分段寄存器:,1 0 0 0 1 1 1 0 mod 0reg r/m,(7) 分段寄存器 寄存器/存儲器:,1 0 0 0 1 1 0 0 mod 0reg r/m,對于寄存器/存儲器與寄存器之間的

27、傳送命令可以采用方式(1),如: MOV AX,BX ;(BX) AX 由于d位值不同,第二字節(jié)的編碼可以有兩種形式: 當(dāng)d=0時,reg對應(yīng)源操作數(shù)BX,即為BX的編碼011;r/m對應(yīng)目的操作數(shù)AX,即為AX的編碼000;此時mod值為11,表示操作數(shù)為寄存器,即mod值和r/m值共同決定了這個操作數(shù)的類型是寄存器并且是AX(000)。因此該指令的機器碼如下: 操作碼 d w mod reg r/m,1 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0, 當(dāng)d=1時,reg對應(yīng)目的操作數(shù)AX,即為AX的編碼000;r/m對應(yīng)源操作數(shù)BX,即為BX的編碼011;mod值指示寄存器應(yīng)

28、為11;所以此時該指令的機器碼如下: 操作碼 d w mod reg r/m,1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1,如果指令是寄存器與存儲器之間的傳送操作,例如:MOV AX,BX+DI+1234H,則對應(yīng)的機器指令只能有一種形式。這是因為reg段只能表示寄存器而無法表示存儲器,而mod和r/m字段的組合根據(jù)mod域值既可以表示寄存器又可以表示存儲器,故當(dāng)操作數(shù)的一方是存儲器時就只能用mod和r/m字段來表示了。究竟是將寄存器的內(nèi)容傳送到存儲器還是將存儲器的內(nèi)容傳送到寄存器,這取決于傳送方向位d的值。,本條指令的存儲器地址通過查找表7.3可知,mod值為10,r/m值

29、為001;而由表7.4得知reg所對應(yīng)的操作數(shù)AX值為000,并且d位值必須為1才能保證將mod和r/m指定的內(nèi)容送AX,所以此時該指令對應(yīng)的機器碼為: 操作碼 d w mod reg r/m 16位位移量,1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0,對于立即數(shù)傳送到寄存器/存儲器的操作可采用方式(2),如: MOV CL,12H ; 立即數(shù)12HCL 這是一個字節(jié)傳送指令,即w=0,因此mod=11和r/m=001表示寄存器CL,第三字節(jié)為立即數(shù)12H,即該指令的機器碼如下: 操作碼 w mod reg r/

30、m 立即數(shù),如果用方式(3)實現(xiàn)該操作則更加簡單。由于此時w=0,reg=001,則該指令所對應(yīng)的機器碼為: 操作碼 w reg 立即數(shù),與方式(2)的機器碼相比節(jié)省了一個字節(jié)。 下面,我們看一下立即數(shù)傳送到存儲器的操作,這種操作只能用方式(2)實現(xiàn),例如:MOV BX+DI+1234H, 5678H查表7.3可知:mod=10,r/m=001;此時該指令對應(yīng)的機器碼為: 操作碼 dw mod reg r/m 16位位移量 16位立即數(shù),由 mod=10可知,存儲器操作數(shù)還帶有16位位移量,這個16位位移量是緊隨在機器碼第二字節(jié)即尋址方式字節(jié)之后的,所以位移量必須插到立即數(shù)之前,以便形成存儲器

31、的有效地址。注意,此時的機器碼指令長度為6個字節(jié),這是8086/8088指令系統(tǒng)中最長的機器碼指令形式。 通過機器碼指令的形成過程可知,機器碼指令的長度是由字或字節(jié)操作以及尋址方式?jīng)Q定的。這一點對編譯來說很重要,因為在編譯過程中必須根據(jù)源指令來確定形成的機器碼指令所應(yīng)具有的字節(jié)數(shù)(即長度)。,由8086/8088指令系統(tǒng)的尋址方式和機器碼指令的尋址方式字節(jié)即mod、r/m和reg字段可以看出:雙操作數(shù)指令允許寄存器與寄存器、寄存器與存儲器之間進(jìn)行操作,此外還允許立即數(shù)到寄存器/存儲器的操作;但無法用mod、r/m和reg字段來同時表示兩個存儲器的地址。如果允許存儲器到存儲器操作的指令出現(xiàn),將會使機器碼指令變得更長、更復(fù)雜。故此,8086/8088舍去了直接進(jìn)行存儲器之間操作的指令,使得機器指令更加簡潔有效。如果要實現(xiàn)存儲器到存儲器的操作,只需經(jīng)過寄存器過渡:先進(jìn)行存儲器到寄存器的操作,并將結(jié)果保存在寄存器中,然后再使用一條由寄存器傳送到存儲器的指令操作即可。,我們再看一下增量指令I(lǐng)NC的處理。INC指令可以采用的機器碼格式如下: (1) 寄存器:,0 1 0 0 0 reg,(2) 寄存器/存儲器:,01000100方式(1)為單操作數(shù)指令,由于reg字段無法表示出是8位寄存器還是16位寄存器,因而系統(tǒng)規(guī)定它為16位寄存器的操作,如 表示為INC SP,而不是INC

溫馨提示

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

最新文檔

評論

0/150

提交評論