版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
-1-CompilerConstructionPrinciples&ImplementationTechniquesDr.ZhengXiaojuanProfessorSoftwareCollegeofNortheastNormalUniversityJune.2014-2-Whereweare?LexicalAnalysisscanningSyntaxAnalysisParsingSemanticAnalysisIntermediateCodeOptimizationIntermediateCodeGenerationTargetCodeGenerationanalysis/frontendsynthesis/backend運行時存儲環(huán)境-3-MainContentofChapter10§10.TargetCodeGeneration10.1Introduction10.2TargetLanguage10.3TemporaryVariable10.4RegistersAllocation10.5GeneratingTargetCodefromQuadruples-4-KnowledgeRelationGraphTargetCodeGenerationwhat從中間代碼生成目標(biāo)代碼(四元式目標(biāo)機器指令)目標(biāo)代碼(目標(biāo)機器指令集)轉(zhuǎn)換抽象地址
目標(biāo)地址生成目標(biāo)代碼函數(shù)相關(guān)函數(shù)入口函數(shù)出口函數(shù)調(diào)用函數(shù)值返回操作型賦值-5-FromIntermediateCodetoTargetCode目標(biāo)代碼中間代碼源程序翻譯過程特點:(1)執(zhí)行過程的直譯;(2)采用抽象地址;翻譯過程特點:(1)執(zhí)行過程的具體全部實現(xiàn);(2)采用具體地址;(3)需要考慮運行時存儲空間問題;(4)函數(shù)返回地址;-6-10.1IntroductiontoTargetCodeGenerationMaintask:在把中間代碼翻譯成目標(biāo)代碼的同時,1.給變量分配實際地址2.寄存器分配3.生成管理過程AR的代碼Dependsontargetmachineandtargetmachinelanguage;-7-10.2TargetLanguage(目標(biāo)代碼)目標(biāo)語言(目標(biāo)代碼)虛擬機代碼(JVM)portability目標(biāo)機器代碼()目標(biāo)代碼有三種形式:
①可以立即執(zhí)行的機器語言代碼,所有地址都重定位;
②待裝配的機器語言模塊,當(dāng)需要執(zhí)行時,由連接裝入程序把它們和某些運行程序連接起來,轉(zhuǎn)換成能執(zhí)行的機器語言代碼;③匯編語言代碼,須經(jīng)過匯編程序匯編后,成為可執(zhí)行的機器語言代碼。-8-10.2TargetLanguage(目標(biāo)代碼)目標(biāo)代碼生成階段應(yīng)考慮直接影響到目標(biāo)代碼速度的三個問題:一﹑如何生成較短的目標(biāo)代碼;二﹑如何充分利用計算機中的寄存器,減少目標(biāo)代碼訪問存儲單元的次數(shù);三﹑如何充分利用計算機指令系統(tǒng)的特點,以提高目標(biāo)代碼的質(zhì)量。-9-一種目標(biāo)機器語言目標(biāo)地址形式假設(shè):C是常量,R是寄存器,d是偏移量表示方法:(R)代表R地址對應(yīng)的內(nèi)容;立即式:#C----C是值寄存器式:R----R本身就是一個地址;變址式:d[R]----d+(R),R的內(nèi)容加上偏移d得到的地址間接寄存器:*R----(R),R的內(nèi)容對應(yīng)的地址間接變址:*d[R]----(d+(R)),R的內(nèi)容加上偏移d后得到的地址的內(nèi)容;-10-FromAbstractAddresstoObjectAddress(CProgrammingLanguage)(0,off,dir)(0,off,indir)(1,off,dir)(1,off,indir)(-1,off,dir)(-1,off,indir)抽象地址形式off[gp]*off[gp](off+InitOff)[sp]*(off+InitOff)[sp](off+InitOff)[sp]*(off+InitOff)[sp]目標(biāo)地址計算-11-一種目標(biāo)機器語言指令格式(依賴于具體的目標(biāo)機器)OpR,#C(立即-----寄存器)含義是(R)與C做op操作后,結(jié)果送到
R對應(yīng)地址中;OpR2,d(R1)(存儲器-----寄存器)含義是(R2)和((R1)+d)做op操作后,結(jié)果送到
R2對應(yīng)地址中;OpR1,R2(寄存器-----寄存器)含義是(R2)和(R1)做op操作后,結(jié)果送到
R1對應(yīng)地址中;-12-一種目標(biāo)機器語言基本指令集合:LoadR,Source------從Source讀出送入RStoreR,Target------R的內(nèi)容送入TargetAddR,Source------R+Source結(jié)果送入RJump(0/1)label-------跳轉(zhuǎn)到label對應(yīng)的地址INR-------輸入值到ROUTR-------輸出R的值LEAR,A-------A的地址送給R-13-10.3TemporaryVariable(臨時變量)臨時變量的特點數(shù)量多,壽命短;不優(yōu)化,只定義一次,使用一次,且定義點和使用點在同一個基本塊內(nèi);公共表達(dá)式節(jié)省,將出現(xiàn)多次引用。臨時變量的存儲空間x:=a+b-c+d,則產(chǎn)生的中間代碼為:(+,a,b,t1)(-,t1,c,t2)(+,t2,d,t3)(:=,t3,x)
3個臨時變量可共享一個臨時單元。-14-臨時變量的空間分配可以在中間代碼生成或者目標(biāo)代碼生成時做;靜態(tài)分配法(共享法)將臨時變量的空間安排在AR棧區(qū)。計算出臨時變量的活動區(qū)間,如果兩個活動區(qū)間不相交,則可以共享同一單元。動態(tài)分配法(隨用隨分配法)過程調(diào)用時分配的AR區(qū)中不含臨時變量部分,以后每當(dāng)要保存臨時變量的值時,動態(tài)分配到棧區(qū)。當(dāng)臨時變量所占的空間比較大時,這種方法比較好。-15-10.4RegisterAllocation(寄存器分配)寄存器分配應(yīng)遵循的原則:寄存器優(yōu)先原則:即變量的值盡可能的存放在寄存器中寄存器活躍原則:即變量的值至少有下一次的引用時才分配寄存器寄存器多載原則:即一個寄存器中可能存放多個變量的值。典型的例子是通過賦值操作的結(jié)果。源變量和被賦值的變量共用一個寄存器RegisterAlloc()doesregisterallocation,andreturnsanavailableregister;-16-10.5GeneratingTargetCodefromQuadruples四元式種類運算型:(op,A,B,T)賦值:(Assig,A,_,B)跳轉(zhuǎn)和標(biāo)號函數(shù)相關(guān)(ENTRY,label,size,level)(ENDFUNC,_,_)參數(shù)傳遞(CALL,f,true/false,result)(RETURN,_,_,t)-17-運算型目標(biāo)代碼生成(op,A,B,T)的代碼生成算法要點(不考慮優(yōu)化)確定A,B和T的目標(biāo)地址,記為A.addr,B.addr和T.addr;找到一個可用的寄存器R=RegisterAlloc(),生成如下目標(biāo)代碼LoadR,A.addrOpR,B.addrStoreR,T.addr-18-Example(+,a,b,t),其中
a:(0,2,dir);b:(1,2,indir),t:(-1,5,dir)a的目標(biāo)地址:2[gp]b的目標(biāo)地址:*(2+InitOff)[sp]t的目標(biāo)地址:(5+InitOff)[sp]LoadR,2[gp]AddR,*(2+InitOff)[sp]StoreR,(5+InitOff)[sp]-19-(Assig,A,_,B)的代碼生成
算法要點(不考慮優(yōu)化):①
求A和B的地址。②
申請寄存器R,生成(LoadR
,
A.addr)指令,③生成指令(StoreR
,B);-20-
標(biāo)號和JUMP的代碼生成思想:遇到(LABEL,L)時,不生成代碼,保留(L,Pc),Pc為當(dāng)前代碼下一條指令;當(dāng)遇到(JUMP,L)時,則生成對應(yīng)的轉(zhuǎn)向指令(JUMP,Pc)關(guān)鍵問題:可能出現(xiàn)標(biāo)號使用在前定義在后,則需要構(gòu)造轉(zhuǎn)向標(biāo)號鏈,進(jìn)行回填。(保留各個位置也可以)中間代碼……(JUMP,L)……(JUMP,L)……(JUMP,L)……(LABEL,L)目標(biāo)代碼……………………Pc:標(biāo)號地址表:
{}P1:(JUMP,nil){(0,L,P1)}Pi:(JUMP,P1){(0,L,Pi)}Pk:(JUMP,Pi){(0,L,Pk)}{(1,L,Pc)}PcPcPc-21-過程/函數(shù)代碼生成(1)相關(guān)四元式:(VALACT,a,off,size);(VARACT,a,off,size)(PROACT,p,off,size);(FUNACT,a,off,size)(CALL,<f>,true/false,result)(ENTRY,Label,Level,size)(ENDFUNC,-,-,-)(2)過函調(diào)用時,需要加入一些目標(biāo)代碼,用于完成如下工作:
①申請新AR空間②參數(shù)傳遞③填寫某些AR內(nèi)容④轉(zhuǎn)向相應(yīng)過程體過程/函數(shù)返回時:①釋放AR②恢復(fù)信息③返回值-22-
(3)參數(shù)傳遞的代碼:sp:當(dāng)前AR的首地址;top:棧頂指針:①(VALACT,c,offset,1)→LoadR,#cStoreR,(offset+InitOff)[top](VALACT,a,offset,1)→LoadR,a.addrStoreR,(offset+InitOff)[top]
參數(shù)傳遞的目標(biāo)代碼生成-23-(3)參數(shù)傳遞的代碼:sp:當(dāng)前AR的首地址;top:棧頂指針:
②(VARACT,a,offset,1)→LEAR,a.addrStoreR,(offset+InitOff)[top]參數(shù)傳遞的目標(biāo)代碼生成-24-(3)參數(shù)傳遞的代碼:sp:當(dāng)前AR的首地址;top:棧頂指針:③實在函數(shù):(FUNACT,p,offset,1)→LoadR,EntryAddr(p)StoreR,(offset+InitOff)[top]
其中EntryAddr(p)代表的是函數(shù)p的入口地址
;
形參函數(shù):(FUNACT,P,offset,1)→LoadR,P.addrStoreR,(offset+InitOff)[top]
其中P.addr是指形參函數(shù)P對應(yīng)的單元地址;參數(shù)傳遞的目標(biāo)代碼生成-25-(4)過程/函數(shù)調(diào)用①(call,<f>,true,result)→LEAR,result.addr(StoreR,Re_Val[top])(LoadR,pc+3)(StoreR,Re_A[top])(JUMPEntryAddr(f))返回值對應(yīng)變量的地址新AR的相應(yīng)位置(2)返回地址新AR相應(yīng)位置(3)調(diào)轉(zhuǎn)到函數(shù)的入口地址;-26-(4)過程/函數(shù)調(diào)用(call,<f>,false,result)→LEAR,result.addr(StoreR,Re_Val[top])(LoadR,pc+4)(StoreR,Re_A[top])(LoadR,f.addr)(JUMP,R)返回值對應(yīng)變量的地址新AR的相應(yīng)位置(2)返回地址新AR相應(yīng)位置(3)調(diào)轉(zhuǎn)到函數(shù)的入口地址;-27-(5)過/函入口:(Entry,Label,size,Level)(Storesp,
DL[top])------保留oldsp(LoadR,Level)------保留層數(shù)(StoreR,L[top])(C語言沒有必要)(Loadsp,top)------修改sp
(ADDtop,size)
------修改top記住label對應(yīng)的代碼地址;-28-(6)過/函出口:(ENDFUN,-,-,-)
①恢復(fù)寄存器內(nèi)容
②(Loadtop,sp)--------top=sp(Loadsp,DL[sp])------sp=CurrentAR.sp
(LoadR,Re_A[top])
(JUMP,R)-29-(7)返回語句:(RETUTRN,-,-,result)
LEAR1,Re_Val[sp]LoadR2,result.addr
StoreR2,*R1
(JumpEndFun)對應(yīng)本函數(shù)中(ENDFUN,_,_,_)
對應(yīng)目標(biāo)代碼地址
-30-Exampleconstintn=5;intsum=0;intfac(inti){ifi=0return1;ifi<0return-1;return(i*fac(i-1));}voidmain(){sum=fac(n);}
(ENTRY,L1,2,0)(EQ,i,0,t1)(JUMP0,t1,_,L2)(RETURN,_,_,1)(LABEL,_,_,L2)(assign,0,_,sum)(LT,i,0,t1)(JUMP0,t1,_,L3)(RETURN,_,_,-1)(LABEL,_,_,L3)
(-,i,1,t2)(VALACT,t2,0,1)(CALL,fac,true,t3)(*,i,t3,t4)(RETURN,_,_,t4)(ENDFUNC,_,_,_)(ENTRY,L4,1,0)(VALACT,n,0,1)(CALL,fac,true,sum)(ENDFUNC,_,_,_)-31-TargetCodeGenerationFourregisterssp:保存當(dāng)前AR的首地址;top:保存當(dāng)前棧頂?shù)刂?gp:保存靜態(tài)區(qū)的首地址;pc:程序計數(shù)器;
ActivationRecord動態(tài)鏈地址0[sp]返回地址1[sp]返回值2[sp]臨時變量形參局部變量空間大小3[sp]spoffsetInitOff=4top-32-目標(biāo)地址抽象地址目標(biāo)地址sumi(fac)t1,t2,t3,t4(fac)n(main)(0,0,dir)0[gp](1,0,dir)4[sp](-1,1,dir)5[sp](1,0,dir)4[sp]-33-TargetCodeGenerationP1:LoadR,#0P2:StoreR,0[gp]P3:JumpP40
P4:Storesp,0[top]P5:Loadsp,topP6:ADD6,top
(ENTRY,L1,2,0)(EQ,i,0,t1)(JUMP0,t1,_,L2)(RETURN,_,_,1)(LABEL,_,_,L2)(assign,0,_,sum)保存動態(tài)鏈地址修改sp修改topP7:LoadR,#0P8:EQR,4[sp]P9:StoreR,5[sp]P10:Jump0R,P11:LoadR,#1P12:StoreR,*2[sp]P13:JumpP36P14-34-(LT,i,0,t1)(JUMP0,t1,_,L3)(RETURN,_,_,-1)(LABEL,_,_,L3)
TargetCodeGenerationP14:LoadR,#0P15:LTR,4[sp]P16:StoreR,5[sp]P17:Jump0R,P18:LoadR,#(-1)P19:StoreR,*2[sp]P20:JumpP36P21-35-TargetCodeGeneration
(-,i,1,t2)(VALACT,t2,0,1)(CALL,fac,true,t3)(*,i,t3,t4)(RETURN,_,_,t4)(ENDFUNC,_,_,_)P21:LoadR,4[sp]P22:SubR,#1P23
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度醫(yī)療診所負(fù)責(zé)人二零二五年度全面免責(zé)協(xié)議書
- 2025年度新能源充電樁建設(shè)合作終止合同協(xié)議
- 2025年度商業(yè)地產(chǎn)租賃違約責(zé)任及賠償合同
- 2025年度魚塘承包與共營合作協(xié)議書(二零二五)
- 二零二五年度醫(yī)院后勤保障服務(wù)外包合作協(xié)議
- 二零二五年度地下室租賃權(quán)及增值服務(wù)合同
- 2025年度員工入職與員工培訓(xùn)與職業(yè)規(guī)劃合同
- 2025年度國家公派留學(xué)項目學(xué)生海外安全教育與保障協(xié)議
- 二零二五年度醫(yī)院口腔科醫(yī)生聘用協(xié)議
- 二零二五年度酒店餐飲調(diào)料及食品添加劑購銷協(xié)議2篇
- 洞悉現(xiàn)狀 明確方向-初三上期末家長會
- 2025社保政策培訓(xùn)
- 2024年單位司機個人工作總結(jié)(6篇)
- 幼兒園幼教集團2025學(xué)年第二學(xué)期工作計劃
- 【9物(北師)期末】阜陽市臨泉縣2023-2024學(xué)年九年級上學(xué)期期末考試物理試題
- 眼鏡銷售儀容儀表培訓(xùn)
- “兩高”發(fā)布《關(guān)于辦理拒不執(zhí)行判決、裁定刑事案件適用法律若干問題的解釋》(新舊對照表)
- 醫(yī)生或醫(yī)技崗位招聘面試題與參考回答(某大型國企)2024年
- 2024國考:公司座談提綱2024
- 2024年掃地機器人市場動態(tài)及行業(yè)發(fā)展分析
- 藝術(shù)學(xué)概論學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
評論
0/150
提交評論