第12章pl0代碼生成_第1頁
第12章pl0代碼生成_第2頁
第12章pl0代碼生成_第3頁
第12章pl0代碼生成_第4頁
第12章pl0代碼生成_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1PL/0編譯程序的目標代碼結構和代碼生成編譯程序的目標代碼結構和代碼生成 目標代碼目標代碼類類pcodepcode是是一種一種假想棧式計算機假想棧式計算機的的匯編語言匯編語言。指令格式:指令格式:f l af l af f功能碼功能碼l l層次差層次差 (標識符(標識符引用層引用層減去減去定義層定義層)a a根據不同的指令有所區(qū)別根據不同的指令有所區(qū)別 目標指令見下頁目標指令見下頁見P23頁2L LI IT T 0 0 a a 將將常常數(shù)數(shù)值值取取到到棧棧頂頂,a a為為常常數(shù)數(shù)值值 L LO OD D l l a a 將將變變量量值值取取到到棧棧頂頂,a a為為相相對對運運行行棧?;分?/p>

2、的的偏偏移移量量,l l為為層層差差 S ST TO O l l a a 將將棧棧頂頂內內容容送送入入某某變變量量單單元元中中,a a為為相相對對運運行行棧?;分菲埔屏苛?,l l為為層層差差 C CA AL L l l a a 調調用用過過程程,a a為為過過程程入入口口地地址址,l l為為層層差差 I IN NT T 0 0 a a 在在運運行行棧棧中中為為被被調調用用的的過過程程開開辟辟a a個個單單元元的的數(shù)數(shù)據據區(qū)區(qū) J JM MP P 0 0 a a 無無條條件件跳跳轉轉至至a a地地址址 J JP PC C 0 0 a a 條條件件跳跳轉轉,當當棧棧頂頂布布爾爾值值非非真真

3、則則跳跳轉轉至至a a地地址址,否否則則順順序序執(zhí)執(zhí)行行 O OP PR R 0 0 0 0 過過程程調調用用結結束束后后, ,返返回回調調用用點點并并退退棧棧 O OP PR R 0 0 1 1 棧棧頂頂元元素素取取反反 O OP PR R 0 0 2 2 次次棧棧頂頂與與棧棧頂頂相相加加,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 3 3 次次棧棧頂頂減減去去棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 4 4 次次棧棧頂頂乘乘以以棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 5

4、 5 次次棧棧頂頂除除以以棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 6 6 棧棧頂頂元元素素的的奇奇偶偶判判斷斷,結結果果值值在在棧棧頂頂 O OP PR R 0 0 7 7 O OP PR R 0 0 8 8 次次棧棧頂頂與與棧棧頂頂是是否否相相等等,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 9 9 次次棧棧頂頂與與棧棧頂頂是是否否不不等等,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 1 10 0 次次棧棧頂頂是是否否小小于于棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧

5、O OP PR R 0 0 1 11 1 次次棧棧頂頂是是否否大大于于等等于于棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 1 12 2 次次棧棧頂頂是是否否大大于于棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 1 13 3 次次棧棧頂頂是是否否小小于于等等于于棧棧頂頂,退退兩兩個個棧棧元元素素,結結果果值值進進棧棧 O OP PR R 0 0 1 14 4 棧棧頂頂值值輸輸出出至至屏屏幕幕 O OP PR R 0 0 1 15 5 屏屏幕幕輸輸出出換換行行 O OP PR R 0 0 1 16 6 從從命命令令行

6、行讀讀入入一一個個輸輸入入置置于于棧棧頂頂 指指令令功功能能表表3代碼生成代碼生成代碼生成是由過程代碼生成是由過程GENGEN完成。完成。P417P417GENGEN有有3 3個個參數(shù)參數(shù),分別代表目標代碼的,分別代表目標代碼的功能碼功能碼,層差層差和和位移量位移量。例如。例如 gen(opr,0,16);gen(opr,0,16);從命令行讀取值到棧頂從命令行讀取值到棧頂 gen(sto,lev-level,adr)gen(sto,lev-level,adr) 將棧頂內容送到變量單元中,將棧頂內容送到變量單元中, levlev:當前:當前處理的處理的過程過程層次層次 levellevel:被

7、引用變量或過程所在:被引用變量或過程所在層次層次 CXCX:為目標代碼:為目標代碼codecode數(shù)組的下標指針數(shù)組的下標指針4Code: array0.cxmax of instruction; p414fct=(lit, opr, lod, sto, cal, int, jmp, jpc) P413Instruction= packec record P413 f: fct; l: 0.levmax a: 0.amax; end;5CODECODE為一維數(shù)組,數(shù)組元素為記錄型數(shù)據。每一個記錄就是一條目標指令。CXCX為指令的指針,由0開始順序增加。實際上目標代碼的順序是內層過程的排在前邊,

8、實際上目標代碼的順序是內層過程的排在前邊,主程序的目標代碼在最后。主程序的目標代碼在最后。下面我們給出一個下面我們給出一個PL/0PL/0源程序和對應的目標程序源程序和對應的目標程序的清單。的清單。在在block入口處生成一條入口處生成一條(jmp,0,0)指令,作為過程指令,作為過程體入口指令,該指令的第體入口指令,該指令的第3區(qū)域的區(qū)域的0需分析到過需分析到過程體入口時才返填。程體入口時才返填。6 const a=10; const a=10;var b,c;var b,c;procedure p;procedure p; beginbegin c:=b+a; c:=b+a; end; e

9、nd;beginbegin read(b); read(b); while while b#0b#0 do do begin begin call p; call p; write(2 write(2* *c);c); read(b); read(b); end endend.end.( 0) jmp 0 8 ( 0) jmp 0 8 轉向轉向主程序入口主程序入口( 1) jmp 0 2 ( 1) jmp 0 2 轉向轉向過程過程p p入口入口( 2) int 0 3 ( 2) int 0 3 過程過程p p入口入口, ,為過程為過程p p開辟空間開辟空間( 3) lod 1 3 ( 3) l

10、od 1 3 取變量取變量b b的值到棧頂?shù)闹档綏m? 4) lit 0 10 ( 4) lit 0 10 取常數(shù)取常數(shù)1010到棧頂?shù)綏m? 5) opr 0 2 ( 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 ( 6) sto 1 4 棧頂值送變量棧頂值送變量c c中中( 7) opr 0 0 ( 7) opr 0 0 退棧并返回調用點退棧并返回調用點(16)(16)( 8) int 0 5 ( 8) int 0 5 主程序入口開辟主程序入口開辟5 5個??臻g個??臻g( 9) opr 0 16 ( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀

11、入值置于棧頂(10) sto 0 3 (10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b b中中(11) (11) lod 0 3 lod 0 3 將變量將變量b b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 (12) lit 0 0 將常數(shù)值將常數(shù)值0 0進棧進棧(13) opr 0 9 (13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) (14) jpc 0 24jpc 0 24 等時轉等時轉(24)(24)(條件不滿足轉條件不滿足轉)(15) cal 0 2 (15) cal 0 2 調用過程調用過程p p(16) lit 0 2 (16) lit

12、 0 2 常數(shù)值常數(shù)值2 2進棧進棧(17) lod (17) lod 0 0 4 4 將變量將變量c c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 (18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2(2* *c)c)(19) opr 0 14 (19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 (20) opr 0 15 換行換行(21) opr 0 16 (21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto (22) sto 0 0 3 3 棧頂值送變量棧頂值送變量b b中中(23) jmp 0 11 (

13、23) jmp 0 11 無條件轉到循環(huán)入口無條件轉到循環(huán)入口(11)(11)(24) opr 0 0 (24) opr 0 0 結束退棧結束退棧7PL/0PL/0編譯程序的目標代碼生成是由編譯程序的目標代碼生成是由GENGEN過程完成的過程完成的 ,當,當語法分析正確語法分析正確, ,則調用目標代碼生成過程以生成與則調用目標代碼生成過程以生成與PL/0PL/0語句等價功能的目標代碼,直到編譯正常結束。語句等價功能的目標代碼,直到編譯正常結束。 注意:過程說明部分,變量和常量的說明都不產生目注意:過程說明部分,變量和常量的說明都不產生目標代碼。標代碼。 對分程序體入口的處理(見程序文本對分程序

14、體入口的處理(見程序文本P424頁頁block 的過的過程體)程體)begin (*block*)dx:=3;tx0:=tx; (*保留當前保留當前table表指針值表指針值,實際為過程名在實際為過程名在table表表中的位置中的位置*)tabletx.adr:=cx;(*保留當前保留當前code指針值到過程名指針值到過程名的的adr域域*) gen(jmp,0,0);(jmp,0,0)指令,作為過程體入口指令,該指指令,作為過程體入口指令,該指令的第令的第3區(qū)域的區(qū)域的0需分析到過程體入口時才需分析到過程體入口時才返填。返填。8錄過程在code的入口到table中的adr域如下表所示: (*

15、生成轉向過程體入口的指令,該指令的地址為生成轉向過程體入口的指令,該指令的地址為cx已保留在過程名的已保留在過程名的adr域,域,真正的過程體入口地址,等生成過程體入口的指令時,將過程體入口回填真正的過程體入口地址,等生成過程體入口的指令時,將過程體入口回填(jmp,0,0)的第)的第3區(qū)域,同時填到區(qū)域,同時填到tabletx0.adr 中中*)tx0tx0:=tx;tabletx.adr:=cx;tx9table表格管理 codetabletx0.adr.a:=cx;tx0txtabletx0.adr=cx10過程體入口時的處理 table表格管理 codetabletx0.adr.a:=

16、cx;(cx為過程入口地址)為過程入口地址) with tabletx0 do begin adr:=cx; (tabletx0.adr=cx)size:=dx; (tabletx0.sizedx)end;請?zhí)貏e注意請?zhí)貏e注意dx、 tx、 cx的作用和如何處理信息之的作用和如何處理信息之間的連接關系。間的連接關系。11 CASE WHILESYM:CX1=CX; GetSym(); /保留保留L1的地址的地址 CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX); /生成生成B的代碼的代碼CX2=CX; GEN(JPC,0,0);/條件跳轉條件跳轉, L2待定待定,

17、if (SYM=DOSYM) GetSym();else Error(18);STATEMENT(FSYS,LEV,TX);/生成生成S的代碼的代碼GEN(JMP,0,CX1); /無條件跳轉無條件跳轉, 轉到轉到L1CODECX2.A=CX; /回填回填L2break; switch (SYM) While B Do SBFalseS轉L1L1:L2 :CX1CX212條件語句的一般形式:條件語句的一般形式:IF IF 條件條件B THEN B THEN 語句語句S1 ELSE S1 ELSE 語句語句S2 S2 If B Then0(false) S1 。 ElseL1:S2L2CX1CX

18、213Switch(SYM)case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX); 生成B的代碼 if (SYM=THENSYM) GetSym();else Error(16); GEN(JPC,0,0);條件跳轉STATEMENT(SymSetUnion(SymSetNew(ELSESYM),FSYS),LEV,TX); 生成S1的代碼If ( ) CODECX1.A=CXElse CX2=CX; Gen(JMP,0,0) ; 轉向S2STATEMENT(FSYS,LEV,TX); 生成S2的代碼 ;break; CX1=CX;SYM!=ELSECODECX1.ACXCODECX2.ACXIf B Then0(false) S1 。 ElseL1:S2L2CX1CX214解釋程序還定義了解釋程序還定義了4個寄存器。個寄存器。(1) I:指令寄存器。存放著當前正在解釋的一條:指令寄存器。存放著當前正在解釋的一條 目標指令。目標

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論