第7章 目標(biāo)代碼生成_第1頁
第7章 目標(biāo)代碼生成_第2頁
第7章 目標(biāo)代碼生成_第3頁
第7章 目標(biāo)代碼生成_第4頁
第7章 目標(biāo)代碼生成_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章目標(biāo)代碼生成7.1

匯編語言虛擬計(jì)算機(jī)模型7.2

從四元式到匯編語言的翻譯7.3

一個(gè)簡(jiǎn)單目標(biāo)代碼生成器7.4

靜態(tài)地址分配1㈠任務(wù)將中間代碼變換成目標(biāo)代碼,實(shí)現(xiàn)源程序的最后翻譯。由于涉及到目標(biāo)機(jī)器的系統(tǒng)結(jié)構(gòu),此階段的工作最復(fù)雜。㈡目標(biāo)代碼的形式①已定位的機(jī)器語言代碼編譯后可立即執(zhí)行。②待裝配的機(jī)器語言代碼模塊目前大多數(shù)編譯系統(tǒng)所產(chǎn)生的目標(biāo)代碼均為可重定位的機(jī)器指令。在執(zhí)行前,將它和系統(tǒng)函數(shù)(源程序中使用)的機(jī)器指令連接成一個(gè)程序,對(duì)未確定的地址進(jìn)行定位(用戶程序?yàn)?地址空間),形成可執(zhí)行的機(jī)器語言程序。在執(zhí)行時(shí),操作系統(tǒng)可將目標(biāo)代碼裝入內(nèi)存的任意位置。③匯編語言代碼需經(jīng)匯編程序翻譯,將其轉(zhuǎn)換成可執(zhí)行的機(jī)器語言代碼。由于硬件廠商提供機(jī)器的匯編程序,所以編譯程序的目標(biāo)代碼通常為匯編語言形式。㈢目標(biāo)代碼生成要求①目標(biāo)代碼數(shù)與中間代碼數(shù)的比值盡可能?。茨繕?biāo)代碼數(shù)盡可能少)。②充分利用寄存器,減少訪問內(nèi)存的次數(shù)。③刪除不必要的臨時(shí)變量。27.1匯編語言虛擬計(jì)算機(jī)模型㈠內(nèi)存①共有64k個(gè)字,1個(gè)字有16個(gè)二進(jìn)制位(2Byte),內(nèi)存地址標(biāo)識(shí)為0-65535。②劃分為256頁,頁號(hào)0-255,每頁的長(zhǎng)度為256個(gè)字,頁內(nèi)位移為0-255。③地址計(jì)算:頁號(hào)*256+頁內(nèi)位移。④255頁用作系統(tǒng)堆棧區(qū)。㈡寄存器①通用寄存器(2字節(jié))共有4個(gè),分別標(biāo)記為R0、R1、R2、R3,用于存放操作數(shù)和計(jì)算結(jié)果,R3還可用于變址尋址。②標(biāo)志寄存器FlagReg

保存CMP指令比較結(jié)果。③堆棧寄存器TopReg(2字節(jié))

TopReg用作系統(tǒng)堆棧棧頂指針。3㈢指令系統(tǒng)(簡(jiǎn)單指令系統(tǒng))指令格式:(定長(zhǎng)、2字節(jié))①操作碼Read從鍵盤讀一個(gè)字到第一地址。Write 從第一地址寫一個(gè)字到屏幕。Load 從第二地址將字裝入第一地址。Store 將第一地址中的字存放到第二地址。Call 控制轉(zhuǎn)移到第二地址指定的內(nèi)存單元,斷點(diǎn)保留在系統(tǒng)堆棧中。Ret 由系統(tǒng)堆棧獲得斷點(diǎn),返回。Add 將第一地址中的字加上第二地址中的字,結(jié)果保留第一地址中。Sub Mul

Div Cmp

將第一地址中的字和第二地址中的字比較,由系統(tǒng)置位FlagReg。FlagReg=-1,表示第一地址中的字小于第二地址中的字。FlagReg=1,表示第一地址中的字大于第二地址中的字。FlagReg=0,表示第一地址中的字等于第二地址中的字。低8位用于第二地址的補(bǔ)充定義4JMP 無條件轉(zhuǎn)移到第二地址指定的內(nèi)存單元。JMPNEG 若FlagReg中的值<0,轉(zhuǎn)移到第二地址指定的內(nèi)存單元。JMPPOS 若FlagReg中的值>0,轉(zhuǎn)移到第二地址指定的內(nèi)存單元。JMPZERO 若FlagReg中的值=0,轉(zhuǎn)移到第二地址指定的內(nèi)存單元。HALT 終止程序執(zhí)行。②第一地址只能是寄存器(R0-R3)③第二地址有四種尋址方式直接地址尋址(M)

LoadRi,MXX Ri←(XX) XX范圍00-FF(第0頁),用16進(jìn)制表示。寄存器尋址(R)

LoadRi,Rj

Ri←(Rj) 寄存器(間址)尋址(@R)

LoadRi,@Rj

Ri←((Rj)) 直接數(shù)尋址(D)

LoadRi,XX Ri←XX XX范圍00-FF,用16進(jìn)制表示。變址尋址(C[R3])

LoadRi,C[R3] Ri←(C*256+(R3)) C為常數(shù)(范圍00-FF),用16進(jìn)制表示。5④指令分類零地址指令

Ret、HaltA型一地址指令(無第二地址)

Write、Read

例:ReadR0 //從鍵盤輸入一個(gè)數(shù),將其存放在R0中。B型一地址指令(無第一地址)

Call、Jmp、JmpNeg、JmpZero、JmpPos

例:Jmp2[R3] //無條件轉(zhuǎn)移至地址2*256+(R3)單元二地址指令

Load、Store、Add、Sub、Mul、Div、Cmp

例:AddR3,1 //R3的內(nèi)容加1程序舉例用匯編程序編寫程序,求5的階乘。LoadR0,1 //R0的范圍1..5LoadR1,1 //初值為1,存放5!。AddR0,1MulR1,R0CmpR0,5JmpNegM2WriteR1Halt67.2從四元式到匯編語言的翻譯㈠符號(hào)表、常數(shù)表和臨時(shí)變量表的內(nèi)存位置四元式中含有變量在符號(hào)表和臨時(shí)變量表中的入口,以及常數(shù)在常數(shù)表中的地址,所以先確定符號(hào)表、臨時(shí)變量表和常數(shù)表在內(nèi)存中的位置,然后再討論四元式的翻譯。①無符號(hào)實(shí)常數(shù)表(第254頁,按地址遞減使用) 起始地址:254*256+255=65279,每個(gè)實(shí)常數(shù)占用2個(gè)字(4Byte)。②無符號(hào)整常數(shù)表(第254頁,按地址遞增使用) 起始地址:254*256=65024,每個(gè)整常數(shù)占用1個(gè)字(2Byte)。③符號(hào)表(第252、253頁,按地址遞減使用) 起始地址:253*256+255=65023,每個(gè)標(biāo)識(shí)符占用4個(gè)字(8Byte)。④臨時(shí)變量表(第252、253頁,按地址遞增使用) 起始地址:252*256=64512,每個(gè)臨時(shí)變量占用4個(gè)字(8Byte)。注:四元式中最多允許出現(xiàn)512/4=128個(gè)不同的變量,包括臨時(shí)變量在內(nèi)。7虛擬內(nèi)存示意圖(共64K、分255頁、每頁255字節(jié))8設(shè)源程序?yàn)椋篴=2+(+b+1),它的四元式代碼為

+ &b 0 &T1 + &T1 &1 &T2 + &2 &T2 &T3 = &T3 0 &a假設(shè)整常數(shù)1在無符號(hào)整常數(shù)表中的地址為65024(254*256+0)整常數(shù)2在無符號(hào)整常數(shù)表中的地址為65025(254*256+1)變量a的符號(hào)表入口為65023(253*256+255)變量b的符號(hào)表入口為65019(253*256+251)臨時(shí)變量T1的臨時(shí)變量表入口為64512(252*256+0)臨時(shí)變量T2的臨時(shí)變量表入口為64516(252*256+4)臨時(shí)變量T3的臨時(shí)變量表入口為64520(252*256+8)實(shí)際四元式代碼序列應(yīng)為

+ 65019 0 64512 + 64512 65024 64516 + 65025 64516 64520 = 64520 0 650239㈡單個(gè)四元式的翻譯四元式的翻譯關(guān)鍵是確定地址,約定如下:指令的第一地址使用R0。指令的第二地址使用R3(兼作變址寄存器)。ARG1、ARG2為變量地址或常數(shù)地址,RESULT一定是變量地址。C1=ARG1/256、D1=ARG1%256。C2=ARG2/256、D2=ARG2%256。C3=RESULT/256、D3=RESULT%256。注:C1、C2、C3表示頁碼,D1、D2、D3表示頁內(nèi)位移。例1:(+,ARG1,ARG2,RESULT)

設(shè)ARG1是變量在符號(hào)表或臨時(shí)變量表入口,ARG2是常數(shù)在常數(shù)表中的地址。解:

LoadR3,D1 //R3←0 LoadR0,C1[R3] //R0←(252*256+0)=(64512) LoadR0,@R0 //R0的內(nèi)容為存放臨時(shí)變量T1值的地址

LoadR3,D2 //R3←0 AddR0,C2[R3] //R0←(254*256+0)=(65024) LoadR3,D3 //R3←4 LoadR3,C3[R3] //R3←(252*256+4)=(64516)

StoreR0,@R3 //R3內(nèi)容為存放臨時(shí)變量T2值的地址 + &T1 &1 &T2上述四元式的地址表示+ 64512 65024 64516C1=64512/256=252 //T1D1=64512%256=0C2=65024/256=254 //常數(shù)1D2=65024%256=0C3=64516/256=252 //T2D3=64516%256=410例2:(=,ARG1,0,RESULT) 其中ARG1是常數(shù)地址。解: LoadR3,D1 //R3←8 LoadR0,C1[R3] //R0←(252*256+8)=(64520) LoadR3,D3 //R3←255 LoadR3,C3[R3] //R3←(253*256+255)=(65023) StoreR0,@R3 //R3的內(nèi)容為存放變量a值的地址㈡單個(gè)四元式的翻譯

四元式的翻譯關(guān)鍵是確定地址,約定如下:指令的第一地址使用R0。指令的第二地址使用R3(兼作變址寄存器)。ARG1、ARG2為變量地址或常數(shù)地址,RESULT一定是變量地址。C1=ARG1/256、D1=ARG1%256。C2=ARG2/256、D2=ARG2%256。C3=RESULT/256、D3=RESULT%256。注:C1、C2、C3表示頁碼,D1、D2、D3表示頁內(nèi)位移。= &T3 0 &a上述四元式的地址表示= 64520 0 65023C1=64520/256=252D1=64520%256=8C3=65023/256=253D3=65023%256=25511㈢對(duì)照表一條四元式代碼通常譯成若干條匯編語句,為了便于轉(zhuǎn)移四元式的翻譯,應(yīng)建立一張對(duì)照表,記錄一個(gè)四元式所對(duì)應(yīng)的匯編語句的個(gè)數(shù)以及匯編語句的編號(hào)。對(duì)照表結(jié)構(gòu)如下:四元式編號(hào)匯編語句條數(shù)匯編語句編號(hào)181269157.3一個(gè)簡(jiǎn)單目標(biāo)代碼生成器

不考慮充分利用寄存器,僅僅使用R0和R3。指令的第一地址使用R0,指令的第二地址使用R3(兼作變址寄存器)。算法描述詳見下一頁。120.procedureGenCode(op,arg1,arg2,result) //一個(gè)簡(jiǎn)單目標(biāo)代碼生成器1. c1←arg1/256:d1←arg1%256;2. c2←arg2/256:d2←arg2%256;3. c3←result/256:d3←result%256;4. comment:R0←(ARG1)5. output"LoadR3,":outputd1:output換行6. output"LoadR0,":outputc1:output"[R3]":output換行7. ifc1=252orc1=253then//ARG1是符號(hào)表或臨時(shí)變量表的入口8. output"LoadR0,@R0":output換行9. endif //ARG1是常數(shù)表入口無需上述指令10. comment:R0←運(yùn)算結(jié)果

處理加法運(yùn)算(ARG2≠0) 處理一元正運(yùn)算(ARG2=0) 處理減法運(yùn)算(ARG2≠0) //詳見下一頁 處理一元負(fù)運(yùn)算(ARG2=0) //詳見下一頁 賦值運(yùn)算(無需任何處理)11. comment:RESULT←(R0)12. output"LoadR3,":outputd3:output換行13. output"LoadR3,":outputc3:output"[R3]":output換行14. output"storeR0,@R3":output換行15.endprocedure13//處理減法運(yùn)算(ARG2≠0)

comment:R0←運(yùn)算結(jié)果

ifop="-"andarg2≠0then output"LoadR3,":outputd2:output換行

ifc2=252orc2=253then //ARG2是符號(hào)表或臨時(shí)變量表的入口

output"LoadR3,":outputc2:output"[R3]":output換行

output"SubR0,@R3":output換行

else //ARG2是常數(shù)表地址

output"SubR0,":outputc2:output"[R3]"<<endl; endifendif//處理一元負(fù)運(yùn)算(ARG2=0)

ifop="-"andarg2=0then //-ARG1=0-ARG1 output"LoadR3,R0":output換行 //將ARG1送R3 output"LoadR0,0":output換行 //將0送R0 output"SubR0,R3":output換行 //R0-R3送R0endif14㈡實(shí)例設(shè)源程序?yàn)椋篴=2+(+b+1),它的四元式代碼為

+ &b 0 &T1 + &T1 &1 &T2 + &2 &T2 &T3 = &T3 0 &a

假設(shè)整常數(shù)1在無符號(hào)整常數(shù)表中的地址為65024(254*256+0)整常數(shù)2在無符號(hào)整常數(shù)表中的地址為65025(254*256+1)變量a的符號(hào)表入口為65023(253*256+255)變量b的符號(hào)表入口為65019(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論