目标代码生成课件.ppt
11.1代碼生成器的設計中的問題語句序列 a:=b+c d:=a+e的代碼如下MOV b, R0ADD c, R0MOV R0, aMOV a, R0 --多餘的指令ADD e, R0 --若a不再使用,第三條也MOV R0, d 多餘11.1代碼生成器的設計中的問題11.1.3寄存器分配 運算對象處於寄存器中的指令通常比運算對象處於記憶體的指令要短一些,執行也快一些寄存器分配 選擇駐留在寄存器中的一組變數寄存器指派 挑選變數要駐留的具體寄存器11.1代碼生成器的設計中的問題11.1.4計算次序的選擇 某種計算次序可能會比其他次序需要較少的寄存器來保存中間結果11.2目標機器模型11.2.1目標機器的指令系統採用模型機作為目標機器二地址指令op 目的,源 LD {源傳到目的} ADD {源加到目的} SUB {目的減去源}11.2目標機器模型指令實例 LD R0, M ST R0,MSTR0,4(R1) contents(4+contents(R1)) LDR0, *4(R0) contents(contents(4+contents(R0))) LD R0, #111.3一個簡單的代碼生成器依次考慮基本塊的每個語句,為其產生代碼假定三地址語句的每種算符都有對應的目標機器算符假定計算結果留在寄存器中盡可能長的時間, 除非:該寄存器要用於其他計算,或者到基本塊結束11.3一個簡單的代碼生成器以基本塊為單位來生成代碼A:=(B+C)*D+EAssign.exe生成中間代碼P313復習局部優化285頁關於優化的說明11.3一個簡單的代碼生成器以基本塊為單位來生成代碼A:=(B+C)*D+ET1:=B+CT2:=T1*DA:=T2+E該目標代碼的缺點?應該如何改進?(1)LDR0,B(2)ADDR0,C(3)STR0T1(4)LDR0,T1(5)MULR0,D(6)STR0,T2(7)LDR0,T2(8)ADDR0,E(9)STR0,A11.3一個簡單的代碼生成器1待用資訊、寄存器描述和地址描述目的:把基本塊內還要被引用的變數儘量保存在寄存器內做法:需要收集待用資訊演示DaiYongXinXi.exe代碼生成時需要動態的寄存器描述和地址描述11.3一個簡單的代碼生成器在代碼生成過程中,需要跟蹤寄存器的內容和名字的地址寄存器描述記住每個寄存器當前存的是什麼在任何一點,每個寄存器保存若干個(包括零個)名字的值名字的地址描述記住運行時每個名字的當前值可以在哪個場所找到這個場所可以是寄存器、棧單元、記憶體地址、甚至是它們的某個集合這些資訊可以存於符號表中這兩個描述在代碼生成過程中是變化的。11.3一個簡單的代碼生成器2簡單的代碼生成演算法對每個三地址語句x:=yopz調用函數getreg決定放yopz計算結果的場所L查看y的地址描述,確定y值當前的一個場所y?.如果y的值還不在L中,產生指令MOVy?,L產生指令opz?,L,其中z?是z的當前場所之一如果y和/或z的當前值不再引用,在塊的出口也不活躍,並且還在寄存器中,那麼修改寄存器描述11.3一個簡單的代碼生成器寄存器選擇函數函數getreg返回保存x:=yopz的x值的場所L如果名字y在R中,這個R不含其他名字的值,並且在執行x:=yopz後y不再有下次引用,那麼返回這個R作為L。否則,返回一個空閒寄存器,如果有的話否則,如果x在塊中有下次引用,或者op是必須用寄存器的算符,那麼找一個已被佔用的寄存器R(可能產生MOVR,M指令,並修改M的描述)否則,如果x在基本塊中不再引用,或者找不到適當的被佔用寄存器,選擇x的記憶體單元作為L。*************************目標代碼一般有以下三種形式:(1)能夠立即執行的機器語言代碼,所有地址均已定位。(2)待裝配的機器語言模組。當需要執行時,由連接裝入程式把它們和某些運行程式連接起來,轉換成能執行的機器語言代碼。(3)組合語言代碼,尚需經過組合語言程式彙編,轉換成可執行的機器語言代碼。1