freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

課件,編譯原理,編譯原理課件,屬性文法,語法制導(dǎo),2005課件說明,第十章(已修改)

2025-05-21 23:04 本頁面
 

【正文】 第十章 代碼生成 ? 代碼生成概述 ? 構(gòu)造代碼生成程序的幾種方法 代碼生成概述 ? 代碼生成階段 ? 構(gòu)造代碼生成程序要考慮的因素 ? 一個簡單的代碼生成程序的構(gòu)造 代碼生成器 (程序 )的位置 ? 代碼生成 將經(jīng)過語法分析或優(yōu)化后的中間代碼,轉(zhuǎn)換成特定機(jī)器的目標(biāo)代碼。 ? 代碼生成器 完成代碼生成這一過程的程序稱為代碼生成器,如圖所示。 代碼生成器的 位置 ?代碼生成器的輸入 –中間代碼 –符號表中的信息 編譯前端 代碼優(yōu)化 代碼生成器符號表目標(biāo)程序源程序中間代碼中間代碼? 目標(biāo)代碼一般有三種形式: – 能夠立即執(zhí)行的機(jī)器語言代碼,所有地址均已定位 – 待裝配的機(jī)器語言模塊。當(dāng)需要執(zhí)行時,由連接裝入程序把它們和某些運(yùn)行程序連接起來,轉(zhuǎn)換成能執(zhí)行的機(jī)器語言代碼 – 匯編語言代碼。尚需經(jīng)過匯編程序匯編,轉(zhuǎn)換成可執(zhí)行的機(jī)器語言代碼 返回 構(gòu)造代碼生成器所要考慮的主要問題 ? 代碼生成所要考慮的主要問題 – 如何使生成的目標(biāo)代碼較短 – 如何充分利用計算機(jī)的寄存器,減少目標(biāo)代碼中訪問存儲單元的次數(shù) 返回 代碼生成的主要成份 ? 指令選擇 – 尋找一個合適的目標(biāo)機(jī)指令以實現(xiàn)給定的中間表示 ? 寄存器分配 – 確定在程序的哪個點將哪些值放在寄存器中比較有益 ? 指令調(diào)度 – 確定程序指令的執(zhí)行順序 ? 三者的關(guān)系 指令選擇 ? 如:中間代碼 a:=a+1: 實現(xiàn) 1: INC a 實現(xiàn) 2: LD R0, a ADD R0, 1 ST R0, a ? 主要功能 多數(shù) CPU的指令集合具有冗余性,也即,同一計算可用兩個或多個不同的指令序列完成。指令選擇器選擇其中之一以產(chǎn)生最好的代碼。 ? 指令選擇的基本原則 – 減小產(chǎn)生代碼的尺寸 – 減小目標(biāo)代碼的執(zhí)行時間 返回 指令選擇(續(xù)) 目標(biāo)機(jī)器的地址方式 地址方式 匯編形式 地址 增加的開銷 直接地址方式 M M 1 寄存器方式 R R 0 間接寄存器方式 *R contents(R) 0 索引方式 c(R) c+contents(R) 1 間接索引方式 *c(R) contents( c+contents(R)) 1 a:=b+c 1. MOV b, R0 ADD c, R0 cost=6 MOV R0, a 2. MOV b, a ADD c, a cost=6 假定 R0, R1和 R2中分別存放了 a, b和 c的地址 , 采用 : 3. MOV *R1, *R0 ADD *R2, *R0 cost=2 假定 R1和 R2中分別包含 b和 c的值 , 并且 b的值在這個賦值以后不再需要 , 則還可有 4. ADD R2, R1 MOV R1, a cost=3 寄存器分配 ? 通常情況下,指令在寄存器中訪問操作數(shù)的開銷要比在內(nèi)存中訪問小。且許多指令不能直接訪問內(nèi)存。如果操作數(shù)在內(nèi)存中,需要顯式地取入到寄存器中。由此可見,將經(jīng)常使用的操作數(shù)保存在寄存器中是比較有利的。然而,寄存器是比較稀少的資源,計算機(jī)程序所需要的寄存器要比可用的寄存器多。寄存器分配負(fù)責(zé)確定在程序的哪個點將哪些值放在寄存器中比較有益。 寄存器分配(續(xù)) ? 寄存器的分配可以分成兩個子問題: – 在寄存器分配期間,為程序的某一點選擇駐留在寄存器中的一組變量; – 在隨后的寄存器指派階段,挑出變量將要駐留的具體寄存器。 寄存器分配原則 ? 生成某變量的目標(biāo)代碼時 , 盡量讓變量的值或計算結(jié)果保留在寄存器中直到寄存器不夠分配為止 。 這樣 , 訪問變量值時可減少對內(nèi)存的存取次數(shù) , 以提高運(yùn)行速度; ? 當(dāng)?shù)交緣K出口時 , 將變量的值存放在內(nèi)存中 , 因為一個基本塊可能有多個后繼結(jié)點或多個前驅(qū)結(jié)點 , 同一變量名在不同前驅(qū)結(jié)點的基本塊內(nèi)出口前存放的 R可能不同 , 或沒有定值 , 所以應(yīng)在出口前把寄存器的內(nèi)容放在內(nèi)存中 , 這樣從基本塊外入口的變量值都在內(nèi)存中; ? 在同一基本塊內(nèi)后邊不再被引用的變量所占用的寄存器應(yīng)盡早釋放 , 以提高寄存器的利用率 。 寄存器分配與寄存器賦值 ? 寄存器分配 – 確定在程序的某個點將哪些值放在寄存器中 ? 寄存器賦值 – 確定分配有寄存器的值應(yīng)該在哪個寄存器中。由于一些目標(biāo)機(jī)可能具有不同類型的寄存器,因此,對寄存器使用的一致性方面也存在著一
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1