2、數(shù)據(jù)放在內(nèi)存中某個固定的位置,可立即執(zhí)行。如早期DOS下.com文件。可重定位的目標程序:需要linker/loader;可分塊編譯。匯編代碼:需借助assembler。代碼生成器設計中若干問題指令選擇-將IR(中間表示)映射為目標機指令序列;而映射的好與差取決于IR的層次、目標指令系統(tǒng)本身和期望的目標代碼質(zhì)量等因素?!吧倒稀笔降拇a骨架:針對IR:x=y+z,(1)LDR0,y(2)ADDR0,R0,z(3)STx,R0代碼生成器設計中若干問題寄存器分配與指派寄存器分配-在程序的某一點,選擇一組可放在寄存
3、器中的變量;寄存器指派-指定某個變量存放在哪一個寄存器中。目標機特殊硬件需求目標機器可能要求整數(shù)乘/除操作在由兩個特殊寄存器組成的寄存器對上!其他特殊設計:棧頂寄存器SP,棧(幀)基址寄存器BP/FP等;中間代碼序列1t=a+bt=t*ct=t/d中間代碼序列2t=a+bt=t+ct=t/d特殊寄存器需求的整數(shù)乘/除操作目標代碼1LR1,aAR1,bMR1,c//占據(jù)R0-R1DR0,dSTR1,t目標代碼2LR0,aAR0,bAR0,cSRDAR0,32DR0,dSTR1,t目標機器模型三地址機器模型、字
4、節(jié)編址。指令種類:加載指令:LDdst,addr//dst?(addr)LDr1,r2//r1?r2;寄存器拷貝操作保存指令:STx,r//x=r寄存器r的內(nèi)容寫回到內(nèi)存位置x計算指令:OPdst,src1,src2//在src1(第一操作數(shù),即左運算量)和src2(第二操作數(shù),即右運算量)之間實施OP運算,其結(jié)果放于目的位置dst中。三個位置不一定互不相同!如:SUBr1,r2,r3,即為r1?r2-r3;以及ADDr1,r1,r2表示r1?r1+r2無條件跳轉(zhuǎn):BRL將使控制流轉(zhuǎn)向標號為L的機器指令;條
5、件跳轉(zhuǎn):Bcondr,L//測試r,滿足則轉(zhuǎn)標號L處指令;否則執(zhí)行下條指令。目標機器模型尋址模式-名字地址:LDr1,y//r1?位置y的值-寄存器:ADDr1,r2,r3//r1?r2+r3-基址+變址:LDr1,c(r2)//r1?(c+r2)-間址訪問:LDr1,*r2//r1?(r2)LDr1,*c(r2)//r1?((c+r2))-直接量:ADDr1,r2,#100//r1?r2+100指令的代價cost=1+各運算分量尋址模式代價寄存器尋址代價為0;內(nèi)存地址和直接量均為1。目標機器模型若干目標指
6、令序列示例:三地址代碼x=y–zb=a[i]ifx7、條件/無條件)跳轉(zhuǎn)。圍繞基本塊的優(yōu)化:塊內(nèi)優(yōu)化--局部優(yōu)化塊間優(yōu)化--全局優(yōu)化基本塊的劃分算法首先,確定基本塊的首指令:中間代碼的第一條三地址指令;任意一個條件或無條件跳轉(zhuǎn)指令的目標指令;緊跟在一個條件或無條件跳轉(zhuǎn)指令后的指令;其次,確定基本塊的范圍:從一個首指令開始(包括該首指令)到(連續(xù)的)下一個首指令(不包括那個首指令)或中間代碼結(jié)束指令(最后一個基本塊的最后一條指令)之間的所有指令?;緣K劃分示例//程序1//10X10矩陣初始化,//并置為單位矩陣forifrom1to10doforjfrom1t
8、o10doa[i,j]=0.0;forifrom1to10doa[i,i]=1.0;i=1j=1t1=10*it2=t1+jt3=8*t2t4=t3–88a[t4]=0.0j=j+1ifj<=10goto(3)i=i+1ifi<=10goto(2)i=1t5=i–1t6=88*t5a[t6]=1.0i=i+1ifi<=10goto(13)首指令1首指令3首指令2首指令4首指令5首指令6基本塊劃分示例(Cont.)