資源描述:
《編譯原理之代碼生成》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、第八章代碼生成湖南大學計算機與通信學院(軟件學院)代碼生成器的位置根據(jù)中間表示生成代碼代碼生成器之前可能有一個優(yōu)化組件代碼生成器的三個任務指令選擇:選擇適當?shù)闹噶顚崿F(xiàn)IR語句寄存器分配和指派:把哪個值放在哪個寄存器中指令排序:按照什么順序安排指令執(zhí)行主要內(nèi)容代碼生成器設計中的問題目標機模型靜態(tài)/棧式數(shù)據(jù)區(qū)分配基本塊相關的代碼生成簡單的代碼生成算法窺孔優(yōu)化8.1代碼生成器設計中的問題設計目標:生成代碼的正確性(最重要)易于實現(xiàn)、測試和維護輸入輸出指令選擇寄存器分配計算順序代碼生成器設計中的問題輸入前端生成的源代碼的IR(中間表示形式)及符號表信息中間
2、表示形式的選擇四元式、三元式、字節(jié)代碼、堆棧機代碼、后綴表示、抽象語法樹、DAG圖、…輸出RISC、CISC;可重定向代碼、匯編語言代碼生成器設計中的問題指令選擇代碼生成器將中間表示形式映射為目標機代碼映射的復雜性由下列因素決定:IR的層次高:用代碼模板翻譯,但代碼質(zhì)量不高,需優(yōu)化低:利用低層次細節(jié)生成更高效的代碼指令集體系結(jié)構本身的特性期望的目標代碼質(zhì)量代碼生成器設計中的問題指令選擇映射的復雜性由下列因素決定:IR的層次指令集體系結(jié)構本身的特性指令的統(tǒng)一性、完整性指令速度和機器慣用語(idioms)期望的目標代碼質(zhì)量代碼生成器設計中的問題指令選擇
3、映射的復雜性由下列因素決定:IR的層次指令集體系結(jié)構本身的特性期望的目標代碼質(zhì)量同一IR程序可用不同代碼序列實現(xiàn),它們的代價不同示例:a=a+1可實現(xiàn)為兩種INCaLDR0,aADDR0,R0,#1STa,R08.2目標機模型本書使用三地址機器模型,指令如下:加載LDdst,addr;把地址addr中的內(nèi)容加載到dst所指寄存器。addr:內(nèi)存地址/寄存器保存STx,r;把寄存器r中的內(nèi)容保存到x中。計算OPdst,src1,src2;把src1和scr2中的值運算后將結(jié)果存放到dst中。無條件跳轉(zhuǎn)BRL;控制流轉(zhuǎn)向標號L的指令條件跳轉(zhuǎn)Bcondr
4、,L;對r中的值進行測試,如果為真則轉(zhuǎn)向L。尋址模式變量x:指向分配x的內(nèi)存位置a(r):地址是a的左值加上r中的值(可類比一維數(shù)組方便記憶)constant(r):寄存器中內(nèi)容加上前面的常數(shù)即其地址;(可類比一維數(shù)組方便記憶)*r:寄存器r的內(nèi)容為其地址*constant(r):r中內(nèi)容加上常量的和所指地址中存放的值為其地址(可類比一維數(shù)組方便記憶)常量#constant56例子x=y-zLDR1,y//R1=yLDR2,z//R2=xSUBR1,R1,R2//R1=R1-R2STx,R1//x=R1b=a[i]LRR1,i//R1=iMULR1
5、,R1,8//R1=R1*8LDR2,a(R1)//R2=contents(a+contents(R1))STb,R2//b=R2程序及指令代價不同的目的有不同的度量最短編譯時間、目標程序大小、運行時間、能耗不可判定一個目標程序是否最優(yōu)指令代價=指令固定代價(設為1)+運算分量尋址模式代價,例:LDR0,R1;代價為1LDR0,M;代價是2LDR1,*100(R2);代價為2常數(shù)和內(nèi)存地址增加代價1,寄存器增加代價為0。8.3目標代碼中的地址Q:如何將IR中的名字轉(zhuǎn)換成目標代碼中的地址?A:程序運行時環(huán)境劃分為4個區(qū)域:代碼區(qū)Code、靜態(tài)區(qū)Sta
6、tic、棧區(qū)Stack和堆區(qū)Heap。不同區(qū)域中的名字采用不同尋址方式。如何為過程調(diào)用和返回生成代碼靜態(tài)分配棧式分配活動記錄靜態(tài)分配每個過程靜態(tài)地分配一個數(shù)據(jù)區(qū)域,開始位置用staticArea表示callcallee的實現(xiàn)STcallee.staticArea,#here+20//保存返回地址BRcallee.codeArea...callee中的語句returnBR*callee.staticArea*為突出重點,經(jīng)常將活動記錄中其它的部分忽略。常量1字長實際為一個常量1字長常量1字長一個指令1字長一個指令1字長返回地址例子三地址代碼actio
7、n1callpaction2halt//p的代碼action3return活動記錄棧式分配寄存器SP指向棧頂?shù)谝粋€過程(main)初始化棧區(qū)過程調(diào)用指令序列ADDSP,SP,#caller.recordSize//增加棧指針,越過調(diào)用者自身的活動記錄ST0(SP),#here+16//保存返回地址BRcallee.codeArea//轉(zhuǎn)移到被調(diào)用者返回指令序列BR*0(SP)//被調(diào)用者最后執(zhí)行,返回調(diào)用者SUPSP,SP,#caller.recordSize//調(diào)用者中減低棧指針34例:快速排序未完,轉(zhuǎn)下頁例:快速排序接上頁名字的運行時刻地址在三
8、地址語句中使用名字(實際上是按符號表條目提供的信息)來引用變量三地址語句x=0如果x分配在開始位置為static靜態(tài)區(qū)域,