編譯原理第14章-pl0_第1頁
編譯原理第14章-pl0_第2頁
編譯原理第14章-pl0_第3頁
編譯原理第14章-pl0_第4頁
編譯原理第14章-pl0_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、編譯原理 PL/0 編譯程序?qū)ёx編譯程序?qū)ёx課外材料課外材料編譯原理 PL/0 編譯程序總體結(jié)構(gòu)編譯程序總體結(jié)構(gòu) PL/0 語言簡介語言簡介 PL/0 編譯程序的詞法分析編譯程序的詞法分析 類類 P-code 虛擬機(jī)虛擬機(jī)PL/0編譯程序?qū)ёx編譯程序?qū)ёx PL/0 編譯程序的語法分析編譯程序的語法分析 PL/0 編譯程序的語義分析編譯程序的語義分析 PL/0 編譯程序的錯(cuò)誤處理編譯程序的錯(cuò)誤處理 PL/0 編譯程序的編譯程序的類類 P-code代碼生成代碼生成編譯原理PL/0編譯程序總體結(jié)構(gòu)編譯程序總體結(jié)構(gòu) T-型圖型圖PL/0類P-codeC/Pascal編譯原理PL/0編譯程序總體結(jié)構(gòu)編譯

2、程序總體結(jié)構(gòu) PL/0編譯程序的組織:編譯程序的組織:一個(gè)以語法、語義一個(gè)以語法、語義 分析程序?yàn)橹行牡姆治龀绦驗(yàn)橹行牡膯伪榫幾g程序單遍編譯程序PL/0 程序程序類類P-code程序程序語法、語義語法、語義分析程序分析程序詞法分詞法分析程序析程序代碼生代碼生成程序成程序編譯原理PL/0 語言簡介語言簡介 PL/0 語言語言為一種簡化的類為一種簡化的類Pascal 語言語言 PL/0 程序示例程序示例 PL/0 語言的語法描述圖語言的語法描述圖 PL/0 語言的語言的EBNF表示表示 PL/0 語言的語義規(guī)則語言的語義規(guī)則編譯原理PL/0 程序示例程序示例CONST A=10; /*主程序常量說

3、明部分主程序常量說明部分*/VAR B,C; /*主程序變量說明部分主程序變量說明部分*/PROCEDURE P; /*主程序過程說明部分主程序過程說明部分*/ VAR D; /*過程過程P的局部變量說明部分的局部變量說明部分*/ PROCEDURE Q; /*過程過程P的局部過程說明部分的局部過程說明部分*/ VAR X; /*過程過程Q的局部變量說明部分的局部變量說明部分*/ BEGIN READ(X); D:=X; WHILE X#0 DO CALL P; END; BEGIN WRITE(D); CALL Q; ENDBEGIN CALL P;END.P 的過程體的過程體Q 的過程體的

4、過程體主程序的過程體主程序的過程體編譯原理PL/0 程序示例程序示例var m, n, r, q; 計(jì)算計(jì)算m和和n的最大公約數(shù)的最大公約數(shù) procedure gcd; begin while r#0 do begin q := m / n; r := m - q * n; m := n; n := r; end end;begin read(m); read(n); 為了方便,規(guī)定為了方便,規(guī)定m = n if m 0 then begin fact := fact * m; m := m - 1; call factorial; end; end;begin 讀入讀入n read(n);

5、 sum := 0; while n 0 do begin m := n; fact := 1; call factorial; sum := sum + fact; n := n - 1; end; 輸出輸出n! write(sum);end. 計(jì)算計(jì)算 sum = 1! + 2 ! + . + n!, (n從控制臺讀入從控制臺讀入)編譯原理PL/0 語言的語法描述圖語言的語法描述圖內(nèi)的文字表示所用到的其他內(nèi)的文字表示所用到的其他語法單位語法單位或或內(nèi)的文字表示內(nèi)的文字表示單詞符號單詞符號 每個(gè)每個(gè)語法單位語法單位對應(yīng)一個(gè)對應(yīng)一個(gè)語法描述圖語法描述圖 一個(gè)入口和一個(gè)出口的有向圖一個(gè)入口和一個(gè)

6、出口的有向圖 從入口可到達(dá)任何節(jié)點(diǎn)從入口可到達(dá)任何節(jié)點(diǎn) 每個(gè)節(jié)點(diǎn)都可以到達(dá)出口每個(gè)節(jié)點(diǎn)都可以到達(dá)出口 從入口到出口的路徑表示該語法單位的從入口到出口的路徑表示該語法單位的 一種合法中間形式(短語)一種合法中間形式(短語) 有兩種類型的節(jié)點(diǎn)有兩種類型的節(jié)點(diǎn)編譯原理PL/0 語言的語法描述圖語言的語法描述圖程序程序分程序分程序. . 例:程序例:程序和和分程序分程序語法單位的語法描述圖語法單位的語法描述圖分程序分程序constidentnumber=,;varident,;procedureident;分程序分程序語句語句編譯原理PL/0 語言的語言的 EBNF 表示表示 EBNF 的元符號的元符

7、號- 是用左右尖括號括起來的中文字表示語法構(gòu)是用左右尖括號括起來的中文字表示語法構(gòu)造造 成分,或稱成分,或稱語法單位語法單位,為非終結(jié)符,為非終結(jié)符。- := 該符號的左部由右部定義,可讀作該符號的左部由右部定義,可讀作定義為定義為 - | 表示表示或或,即左部可由多個(gè)右部定義,即左部可由多個(gè)右部定義- 表示花括號內(nèi)的語法成分可以表示花括號內(nèi)的語法成分可以重復(fù)重復(fù);在不加上;在不加上 下界時(shí)可重復(fù)下界時(shí)可重復(fù)0到任意次數(shù),有上下界時(shí)為可重復(fù)次到任意次數(shù),有上下界時(shí)為可重復(fù)次 數(shù)的限制數(shù)的限制- 表示方括號內(nèi)的成分為表示方括號內(nèi)的成分為任選任選項(xiàng)項(xiàng)- ( ) 表示圓括號內(nèi)的成分表示圓括號內(nèi)的成分

8、優(yōu)先優(yōu)先編譯原理 例:例:PL/0 語言的語言的EBNF表示表示 := . := := CONST , ; := = := := VAR , ; := | := ; ; := PROCEDURE ;PL/0 語言的語言的 EBNF 表示表示編譯原理 例:例:PL/0 語言的語言的EBNF表示表示 := | | | | | | | := := := BEGIN ; END := | ODD := + | - := := | | ( )PL/0 語言的語言的 EBNF 表示表示編譯原理 例:例:PL/0 語言的語言的EBNF表示表示 := + | - := * | / := = | # | | |

9、 = := IF THEN := CALL := WHILE DO := READ ( , ) := WRITE ( , ) := a | b | | X | Y | Z := 0 | 1 | 2 | | 8 | 9PL/0 語言的語言的 EBNF 表示表示編譯原理PL/0 語言的語義規(guī)則語言的語義規(guī)則 類型、上下文約束與作用域規(guī)則類型、上下文約束與作用域規(guī)則- 數(shù)據(jù)類型只有數(shù)據(jù)類型只有整數(shù)類型整數(shù)類型- 數(shù)據(jù)結(jié)構(gòu)只支持?jǐn)?shù)據(jù)結(jié)構(gòu)只支持簡單變量簡單變量和和常數(shù)常數(shù) - 所支持的數(shù)字為最長所支持的數(shù)字為最長 9 位的十進(jìn)制數(shù)位的十進(jìn)制數(shù)- 標(biāo)識符的有效長度為標(biāo)識符的有效長度為10- 標(biāo)識符引用前先

10、要聲明標(biāo)識符引用前先要聲明- 過程無參數(shù)過程無參數(shù)- 過程可嵌套,最多嵌套過程可嵌套,最多嵌套 3 層層- 過程可遞歸調(diào)用過程可遞歸調(diào)用- 內(nèi)層過程可以引用包圍它的外層過程的標(biāo)識符內(nèi)層過程可以引用包圍它的外層過程的標(biāo)識符編譯原理類類P-code虛擬機(jī)虛擬機(jī)輸入數(shù)據(jù)輸入數(shù)據(jù)輸出數(shù)據(jù)輸出數(shù)據(jù)PL/0 程序程序類類P-code程序程序PL/0 編譯程序編譯程序類類 P-code 解釋程序解釋程序類類P-code 虛擬機(jī)虛擬機(jī)編譯原理類類P-code虛擬機(jī)虛擬機(jī) 類類 P-code 語言語言- 一種一種棧式機(jī)棧式機(jī)的的語言語言 此類棧式機(jī)沒有累加器和通用寄存器,此類棧式機(jī)沒有累加器和通用寄存器,有一有

11、一 個(gè)個(gè)棧式存儲器棧式存儲器,有四個(gè)控制寄存器(,有四個(gè)控制寄存器(指令寄指令寄 存器存器 I,指令地址寄存器指令地址寄存器 P,棧頂寄存器棧頂寄存器 T 和和基址寄存器基址寄存器 B),算邏運(yùn)算都在棧頂進(jìn)行),算邏運(yùn)算都在棧頂進(jìn)行 指令格式指令格式f f l l a af : 操作碼操作碼l : 層次差層次差 (標(biāo)識符引用層減去定義層)(標(biāo)識符引用層減去定義層)a : 不同的指令含義不同不同的指令含義不同編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “INT 0 A”- 在棧頂開辟在棧頂開辟 A 個(gè)存儲單元,服務(wù)于被調(diào)用的過程個(gè)存儲單元,服務(wù)于被調(diào)用的過程- A 等于該過程的等于該過程的局

12、部變量數(shù)加局部變量數(shù)加 3- 3 個(gè)個(gè)特殊的特殊的聯(lián)系單元聯(lián)系單元編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 0”- 過程調(diào)用結(jié)束后過程調(diào)用結(jié)束后, ,返回調(diào)用點(diǎn)并退棧返回調(diào)用點(diǎn)并退棧- 重置基址寄存器和棧頂寄存器重置基址寄存器和棧頂寄存器編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “CAL L A”- 調(diào)用地址為調(diào)用地址為 A 的過程(置指令地址寄存器為的過程(置指令地址寄存器為A)- L 為調(diào)用過程與被調(diào)用過程的為調(diào)用過程與被調(diào)用過程的層差層差- 設(shè)置被調(diào)用過程的設(shè)置被調(diào)用過程的3 個(gè)聯(lián)系單元個(gè)聯(lián)系單元編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “LIT 0 A”

13、- 立即數(shù)存入棧頂,即置立即數(shù)存入棧頂,即置T 所指存儲單元的值為所指存儲單元的值為A- T 加加 1 指令指令 “LOD L A”- 將層差為將層差為L、偏移量為偏移量為A的存儲單元的值取到棧頂?shù)拇鎯卧闹等〉綏m? T 加加 1 指令指令 “STO L A”- T 減減 1- 將棧頂?shù)闹荡嫒雽硬顬閷m數(shù)闹荡嫒雽硬顬長、偏移量為偏移量為A的存儲單元的存儲單元 注:注:層差為層差為L、偏移量為偏移量為A的存儲單元,即沿當(dāng)前層靜的存儲單元,即沿當(dāng)前層靜 態(tài)鏈態(tài)鏈SL開始向前第開始向前第L層的層的SL作為基址,加上作為基址,加上A,即為該,即為該 單元的地址單元的地址編譯原理類類P-code虛

14、擬機(jī)虛擬機(jī) 指令指令 “OPR 0 1”- 求棧頂元素的相反數(shù),結(jié)果值留在棧頂求棧頂元素的相反數(shù),結(jié)果值留在棧頂 指令指令 “OPR 0 6”- 棧頂元素的奇偶判斷,若為奇數(shù),結(jié)果為棧頂元素的奇偶判斷,若為奇數(shù),結(jié)果為1;若為偶;若為偶 數(shù),結(jié)果為數(shù),結(jié)果為0 ;結(jié)果值留在棧頂;結(jié)果值留在棧頂編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 2”- 次棧頂與棧頂?shù)闹迪嗉樱Y(jié)果存入次棧頂次棧頂與棧頂?shù)闹迪嗉樱Y(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 3”- 次棧頂?shù)闹禍p去棧頂?shù)闹担Y(jié)果存入次棧頂次棧頂?shù)闹禍p去棧頂?shù)闹担Y(jié)果存入次棧頂- T 減減 1 指令指令 “OPR

15、0 4”- 次棧頂?shù)闹党艘詶m數(shù)闹担Y(jié)果存入次棧頂次棧頂?shù)闹党艘詶m數(shù)闹担Y(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 5”- 次棧頂?shù)闹党詶m數(shù)闹担Y(jié)果存入次棧頂次棧頂?shù)闹党詶m數(shù)闹担Y(jié)果存入次棧頂- T 減減 1編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 8” 比較次棧頂與棧頂是否相等比較次棧頂與棧頂是否相等- 若相等,結(jié)果為若相等,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1 指令指令 “OPR 0 9” 比較次棧頂與棧頂是否不相等比較次棧頂與棧頂是否不相等- 若不相等,結(jié)果為若不相等,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1

16、指令指令 “OPR 0 10” 比較次棧頂是否小于棧頂比較次棧頂是否小于棧頂- 若小于,結(jié)果為若小于,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1 指令指令 “OPR 0 11” 比較次棧頂是否大于等于棧頂比較次棧頂是否大于等于棧頂- 若大于等于,結(jié)果為若大于等于,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1 指令指令 “OPR 0 12” 比較次棧頂是否大于棧頂比較次棧頂是否大于棧頂- 若大于,結(jié)果為若大于,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1 指令指令 “OPR 0 13” 比較次棧頂是否小于等于棧頂比較次棧頂是否小于等于棧頂- 若小于等于,結(jié)果

17、為若小于等于,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “JMP 0 A”- 無條件轉(zhuǎn)移至地址無條件轉(zhuǎn)移至地址 A,即置,即置指令地址寄存器為指令地址寄存器為A 指令指令 “JPC 0 A”- 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令- 若棧頂為若棧頂為 0,則轉(zhuǎn)移至地址,則轉(zhuǎn)移至地址 A,即置指令地址寄存,即置指令地址寄存 器為器為A ;T T 減減1 1編譯原理類類P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 14”- 棧頂?shù)闹递敵鲋量刂婆_屏幕棧頂?shù)闹递敵鲋量刂婆_屏幕- T 減減 1 1 指令指令 “OPR 0 15”- 控制臺屏幕輸出一個(gè)

18、換行控制臺屏幕輸出一個(gè)換行 指令指令 “OPR 0 16”- 從控制臺讀入一行輸入,置入棧頂從控制臺讀入一行輸入,置入棧頂- T 加加 1 1編譯原理類類P-code虛擬機(jī)虛擬機(jī) 類類P-code 解釋程序解釋程序- 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 運(yùn)行棧運(yùn)行棧 int sstacksize 指令寄存器指令寄存器 struct instruction enum fct f; /*操作碼操作碼*/ int l; /*引用層與聲明層的層差引用層與聲明層的層差*/ int a; /*因不同的因不同的f各異各異*/ i 指令地址寄存器指令地址寄存器 int p; 基址寄存器基址寄存器 int b; 棧頂寄存器棧頂寄

19、存器 int t; 虛擬機(jī)代碼段虛擬機(jī)代碼段 struct instruction codecxmax;編譯原理類類P-code虛擬機(jī)虛擬機(jī) 類類P-code 解釋程序解釋程序- 處理流程處理流程 (1)初始化初始化 p=b=t=0; s0=s1=s2=0; (2)取指令到指令寄存器取指令到指令寄存器 i=codep; p+; (3)分析并解釋執(zhí)行指令分析并解釋執(zhí)行指令 i (4)若程序未結(jié)束(若程序未結(jié)束(p != 0),轉(zhuǎn)),轉(zhuǎn)(2) (5)返回返回 編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;begin read(b)

20、; while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8)

21、 int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的

22、值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)btp編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;begin read(b);

23、 while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8)

24、int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的值

25、取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;begin read(b);

26、while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) i

27、nt 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的值取

28、至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt000編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;begin read(b)

29、; while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8)

30、 int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的

31、值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt0005編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;begin read

32、(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)(

33、 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變

34、量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt0005編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;begin r

35、ead(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(1

36、6)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變

37、量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt00055編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; end;beg

38、in read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)

39、用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0

40、4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt000550編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a; en

41、d;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退

42、棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) l

43、od 0 4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt00051編譯原理 例例const a=10;var b,c;procedure p; begin c:=b+a

44、; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回

45、調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(1

46、7) lod 0 4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt0005編譯原理 例例const a=10;var b,c;procedure p; begin c:=

47、b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧

48、并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)

49、棧(17) lod 0 4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt00050016編譯原理 例例const a=10;var b,c;procedure p; be

50、gin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中( 7) opr

51、 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值

52、常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt00050016編譯原理 例例const a=10;var b,c;procedur

53、e p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂值送變量c中中(

54、 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit

55、0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt000500165編譯原理 例例const a=10;var b,c;

56、procedure p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1 4 棧頂值送變量棧頂

57、值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(

58、16) lit 0 2 常數(shù)值常數(shù)值2進(jìn)棧進(jìn)棧(17) lod 0 4 將變量將變量c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2*c)(19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 換行換行(21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機(jī)虛擬機(jī)pbt00050016510編譯原理 例例const a=1

59、0;var b,c;procedure p; begin c:=b+a; end;begin read(b); while b#0 do begin call p; write(2*c); read(b); endend.( 0) jmp 0 8 轉(zhuǎn)向主程序入口轉(zhuǎn)向主程序入口( 1) jmp 0 2 轉(zhuǎn)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為過程p開辟空間開辟空間( 3) lod 1 3 取變量取變量b的值到棧頂?shù)闹档綏m? 4) lit 0 10 取常數(shù)取常數(shù)10到棧頂?shù)綏m? 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto 1

60、4 棧頂值送變量棧頂值送變量c中中( 7) opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個(gè)棧空間個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 將常數(shù)值將常數(shù)值0進(jìn)棧進(jìn)棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時(shí)轉(zhuǎn)相等時(shí)轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論