第十二章代碼生成新_第1頁(yè)
第十二章代碼生成新_第2頁(yè)
第十二章代碼生成新_第3頁(yè)
第十二章代碼生成新_第4頁(yè)
第十二章代碼生成新_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、LOGO1廣東工業(yè)大學(xué)計(jì)算機(jī)學(xué)院廣東工業(yè)大學(xué)計(jì)算機(jī)學(xué)院v PL/O編譯程序所產(chǎn)生的目標(biāo)代碼是一個(gè)編譯程序所產(chǎn)生的目標(biāo)代碼是一個(gè)假想棧式假想棧式計(jì)算機(jī)計(jì)算機(jī)的匯編語(yǔ)言,可稱(chēng)為的匯編語(yǔ)言,可稱(chēng)為類(lèi)類(lèi)PCODE指令代碼,它不依賴(lài)任何指令代碼,它不依賴(lài)任何實(shí)際計(jì)算機(jī)實(shí)際計(jì)算機(jī)v 此類(lèi)棧式機(jī)沒(méi)有累加器和通用寄存器,此類(lèi)棧式機(jī)沒(méi)有累加器和通用寄存器,有一個(gè)有一個(gè)棧式存儲(chǔ)棧式存儲(chǔ)器器,有四個(gè)控制寄存器(,有四個(gè)控制寄存器(指令寄存器指令寄存器 I,指令地址寄存器指令地址寄存器 P,棧頂寄存器棧頂寄存器 T和和基址寄存器基址寄存器 B),算邏運(yùn)算都在棧頂),算邏運(yùn)算都在棧頂進(jìn)行。(這部分內(nèi)容涉及到進(jìn)行。(這部

2、分內(nèi)容涉及到PL/0解釋程序)解釋程序)v 指令格式指令格式f l af l av 指令指令 “LIT 0 A”v LOD:將變量放到棧頂。:將變量放到棧頂。a域?yàn)樽兞吭谒f(shuō)明層中的相對(duì)位置,域?yàn)樽兞吭谒f(shuō)明層中的相對(duì)位置,l為調(diào)用層為調(diào)用層與說(shuō)明層的層差值。與說(shuō)明層的層差值。v STO:將棧頂?shù)膬?nèi)容送入某變量單元中。:將棧頂?shù)膬?nèi)容送入某變量單元中。a和和l域的含意同域的含意同LOD指令。指令。v CAL:調(diào)用過(guò)程的指令。:調(diào)用過(guò)程的指令。a為被調(diào)用過(guò)程的目標(biāo)程序入口地址,為被調(diào)用過(guò)程的目標(biāo)程序入口地址,l為層差。為層差。v INT:為被調(diào)用的過(guò)程:為被調(diào)用的過(guò)程(或主程序或主程序)在運(yùn)行棧中

3、開(kāi)辟數(shù)據(jù)區(qū)。在運(yùn)行棧中開(kāi)辟數(shù)據(jù)區(qū)。a域?yàn)殚_(kāi)辟的單域?yàn)殚_(kāi)辟的單元個(gè)數(shù)。元個(gè)數(shù)。v JMP:無(wú)條件轉(zhuǎn)移指令,:無(wú)條件轉(zhuǎn)移指令,a為轉(zhuǎn)向地址。為轉(zhuǎn)向地址。v JPC:條件轉(zhuǎn)移指令,當(dāng)棧頂?shù)牟紶栔禐榉钦鏁r(shí),轉(zhuǎn)向:條件轉(zhuǎn)移指令,當(dāng)棧頂?shù)牟紶栔禐榉钦鏁r(shí),轉(zhuǎn)向a域的地址,域的地址,否則順序執(zhí)行。否則順序執(zhí)行。v OPR:關(guān)系運(yùn)算和算術(shù)運(yùn)算指令。將棧頂和次棧頂?shù)膬?nèi)容進(jìn)行運(yùn)算:關(guān)系運(yùn)算和算術(shù)運(yùn)算指令。將棧頂和次棧頂?shù)膬?nèi)容進(jìn)行運(yùn)算,結(jié)果存放在次棧頂。此外還可以是讀寫(xiě)等特殊功能的指令,具體,結(jié)果存放在次棧頂。此外還可以是讀寫(xiě)等特殊功能的指令,具體操作由操作由a域值給出。(域值給出。(P23)v 編譯程序的目標(biāo)代碼生

4、成編譯程序的目標(biāo)代碼生成v lev:當(dāng)前:當(dāng)前處理的處理的過(guò)程過(guò)程層次層次v level:被引用變量或過(guò)程所在:被引用變量或過(guò)程所在層次層次v CX:為目標(biāo)代碼:為目標(biāo)代碼code數(shù)組的下標(biāo)指針(數(shù)組的下標(biāo)指針(CX為指令的為指令的指針,由指針,由0開(kāi)始順序增加。)開(kāi)始順序增加。)v 相關(guān)定義相關(guān)定義Code: 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

5、; end;v CODE為一維數(shù)組,數(shù)組元素為記錄型數(shù)據(jù)。每一個(gè)記錄為一維數(shù)組,數(shù)組元素為記錄型數(shù)據(jù)。每一個(gè)記錄就是一條目標(biāo)指令。就是一條目標(biāo)指令。v實(shí)際上目標(biāo)代碼的順序是內(nèi)層過(guò)程的排在前邊,主程序?qū)嶋H上目標(biāo)代碼的順序是內(nèi)層過(guò)程的排在前邊,主程序的目標(biāo)代碼在最后。的目標(biāo)代碼在最后。v 下面我們給出一個(gè)PL/0源程序和對(duì)應(yīng)的目標(biāo)程序的清單。 const a=10;const a=10;var b,c;var b,c;procedure p;procedure p; beginbegin c:=b+a; c:=b+a; end; end;beginbegin read(b); read(b); w

6、hile 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 轉(zhuǎn)向轉(zhuǎn)向主程序入口主程序入口( 1) jmp 0 2 ( 1) jmp 0 2 轉(zhuǎn)向轉(zhuǎn)向過(guò)程過(guò)程p p入口入口( 2) int 0 3 ( 2) int 0 3 過(guò)程過(guò)程p p入口入口, ,為過(guò)程為過(guò)程p p開(kāi)辟空間開(kāi)辟空間( 3) lod 1 3 ( 3) lod 1 3 取變量取變量b b的值到棧頂?shù)闹档綏m? 4) li

7、t 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 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)(16)( 8) int 0 5 ( 8) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5 5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 ( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 (10) sto 0 3 將

8、棧頂值存入變量將棧頂值存入變量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進(jìn)棧進(jìn)棧(13) opr 0 9 (13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) (14) jpc 0 24jpc 0 24 等時(shí)轉(zhuǎn)等時(shí)轉(zhuǎn)(24)(24)(條件不滿(mǎn)足轉(zhuǎn)條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 (15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p p(16) lit 0 2 (16) lit 0 2 常數(shù)值常數(shù)值2 2進(jìn)棧進(jìn)棧(17) lod (17) l

9、od 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 (23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(1

10、1)(11)(24) opr 0 0 (24) opr 0 0 結(jié)束退棧結(jié)束退棧v 對(duì)于過(guò)程對(duì)于過(guò)程(分程序分程序)的代碼生成的代碼生成 在在block入口處生成一條入口處生成一條(jmp,0,0)指令,作為過(guò)程體入口指令,指令,作為過(guò)程體入口指令,該指令的第該指令的第3區(qū)域的區(qū)域的0需分析到過(guò)程體入口時(shí)才返填。需分析到過(guò)程體入口時(shí)才返填。v 對(duì)分程序體入口的處理(見(jiàn)程序文本對(duì)分程序體入口的處理(見(jiàn)程序文本P424頁(yè)頁(yè)block 的過(guò)程體)的過(guò)程體)begin (*block*)dx:=3;tx0:=tx; v (*保留當(dāng)前保留當(dāng)前table表指針值表指針值,實(shí)際為過(guò)程名在實(shí)際為過(guò)程名在tab

11、le表中的位表中的位置置*)tabletx.adr:=cx;(*保留當(dāng)前保留當(dāng)前code指針值到過(guò)程名的指針值到過(guò)程名的adr域域*) gen(jmp,0,0);(上例的前二行!上例的前二行?。﹙ 其實(shí)上述內(nèi)容最重要的是地址的回填(見(jiàn)下幾頁(yè)其實(shí)上述內(nèi)容最重要的是地址的回填(見(jiàn)下幾頁(yè)P(yáng)PT)錄過(guò)程在code的入口到table中的adr域如下表所示: (*生成轉(zhuǎn)向過(guò)程體入口的指令,該指令的地址為生成轉(zhuǎn)向過(guò)程體入口的指令,該指令的地址為cx已保留在過(guò)程名的已保留在過(guò)程名的adr域,域,真正的過(guò)程體入口地址,等生成過(guò)程體入口的指令時(shí),將過(guò)程體入口返填真正的過(guò)程體入口地址,等生成過(guò)程體入口的指令時(shí),將過(guò)

12、程體入口返填(jmp,0,0)的第)的第3區(qū)域,同時(shí)填到區(qū)域,同時(shí)填到tabletx0.adr 中中*)tx0tx0:=tx;tabletx.adr:=cx;txtable表格管理 codetabletx0.adr.a:=cx;tx0txtabletx0.adr=cx過(guò)程體入口時(shí)的處理 table表格管理 codetabletx0.adr.a:=cx;(cx為過(guò)程入口地址,填寫(xiě)在為過(guò)程入口地址,填寫(xiě)在code中)中)with tabletx0 do begin adr:=cx; (tabletx0.adr=cx)size:=dx; (tabletx0.sizedx)end;請(qǐng)?zhí)貏e注意請(qǐng)?zhí)貏e注意

13、dx、 tx、 cx的作用和如何處理信息之間的連的作用和如何處理信息之間的連接關(guān)系。接關(guān)系。 CASE WHILESYM:CX1=CX; GetSym(); /保留保留L1的地址的地址 CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX); /生成生成B的代碼的代碼CX2=CX; GEN(JPC,0,0);/條件跳轉(zhuǎn)條件跳轉(zhuǎn), L2待定待定,if (SYM=DOSYM) GetSym();else Error(18);STATEMENT(FSYS,LEV,TX);/生成生成S的代碼的代碼GEN(JMP,0,CX1); /無(wú)條件跳轉(zhuǎn)無(wú)條件跳轉(zhuǎn), 轉(zhuǎn)到轉(zhuǎn)到L1CODECX

14、2.A=CX; /回填回填L2break; switch (SYM) While B Do SBFalseS轉(zhuǎn)L1L1:L2 :CX1CX2v 附錄附錄v 當(dāng)源程序經(jīng)過(guò)語(yǔ)法分析,如果未發(fā)現(xiàn)錯(cuò)誤時(shí),由編譯程當(dāng)源程序經(jīng)過(guò)語(yǔ)法分析,如果未發(fā)現(xiàn)錯(cuò)誤時(shí),由編譯程序調(diào)用解釋程序序調(diào)用解釋程序,對(duì)目標(biāo)代碼開(kāi)始進(jìn)行解釋執(zhí)行。對(duì)目標(biāo)代碼開(kāi)始進(jìn)行解釋執(zhí)行。v PL/0解釋程序解釋程序PL/0PL/0解釋程序的存儲(chǔ)分配解釋程序的存儲(chǔ)分配v存儲(chǔ)區(qū)存儲(chǔ)區(qū): :v數(shù)組數(shù)組CODECODE存放目標(biāo)程序存放目標(biāo)程序v運(yùn)行時(shí)的數(shù)據(jù)區(qū)運(yùn)行時(shí)的數(shù)據(jù)區(qū)S SvS S是由解釋程序定義的一維整型數(shù)組是由解釋程序定義的一維整型數(shù)組v由于由

15、于PL/OPL/O語(yǔ)言的目標(biāo)程序是一種假想的棧式計(jì)算機(jī)的匯語(yǔ)言的目標(biāo)程序是一種假想的棧式計(jì)算機(jī)的匯編語(yǔ)言,現(xiàn)仍用編語(yǔ)言,現(xiàn)仍用PascalPascal語(yǔ)言解釋執(zhí)行語(yǔ)言解釋執(zhí)行 PL/0解釋程序v 解釋程序定義了解釋程序定義了4個(gè)寄存器:個(gè)寄存器:v I指令寄存器指令寄存器:存放當(dāng)前正在解釋的一條目標(biāo)指令存放當(dāng)前正在解釋的一條目標(biāo)指令v P程序地址寄存器程序地址寄存器:指向下一條要執(zhí)行的目標(biāo)程序的指向下一條要執(zhí)行的目標(biāo)程序的v 地址(相當(dāng)目標(biāo)程序地址(相當(dāng)目標(biāo)程序CODE數(shù)組的下標(biāo))數(shù)組的下標(biāo))T棧頂寄存器棧頂寄存器。指向當(dāng)前棧中最新分配的單元(。指向當(dāng)前棧中最新分配的單元(T也是也是數(shù)組數(shù)組S

16、的下標(biāo))。的下標(biāo))。 每個(gè)過(guò)程當(dāng)它被調(diào)用時(shí),給它分配的數(shù)據(jù)空間(下邊稱(chēng)每個(gè)過(guò)程當(dāng)它被調(diào)用時(shí),給它分配的數(shù)據(jù)空間(下邊稱(chēng)數(shù)據(jù)段)可分成兩部分:數(shù)據(jù)段)可分成兩部分:靜態(tài)部分:包括變量存放區(qū)和三個(gè)聯(lián)系單元靜態(tài)部分:包括變量存放區(qū)和三個(gè)聯(lián)系單元?jiǎng)討B(tài)部分:作為臨時(shí)工作單元和累加器用。需要時(shí)隨動(dòng)態(tài)部分:作為臨時(shí)工作單元和累加器用。需要時(shí)隨時(shí)分配,用完后立即釋放時(shí)分配,用完后立即釋放B基址寄存器基址寄存器。指向當(dāng)前執(zhí)行過(guò)程的在數(shù)據(jù)區(qū)。指向當(dāng)前執(zhí)行過(guò)程的在數(shù)據(jù)區(qū)S中中給該過(guò)程分配的數(shù)據(jù)段起始地址,稱(chēng)基地址給該過(guò)程分配的數(shù)據(jù)段起始地址,稱(chēng)基地址v當(dāng)過(guò)程被調(diào)用時(shí),在棧頂分配三個(gè)聯(lián)系單元,這三個(gè)聯(lián)當(dāng)過(guò)程被調(diào)用時(shí),

17、在棧頂分配三個(gè)聯(lián)系單元,這三個(gè)聯(lián)系單元存放的內(nèi)容分別為:系單元存放的內(nèi)容分別為:SL靜態(tài)鏈靜態(tài)鏈:指向定義該過(guò)程的:指向定義該過(guò)程的直接外過(guò)程直接外過(guò)程(或主程序(或主程序)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址DL動(dòng)態(tài)鏈動(dòng)態(tài)鏈:指向調(diào)用該過(guò)程前:指向調(diào)用該過(guò)程前正在運(yùn)行過(guò)程正在運(yùn)行過(guò)程的數(shù)據(jù)段的數(shù)據(jù)段基地址基地址RA返回地址返回地址:記錄調(diào)用該過(guò)程目標(biāo)程序的斷點(diǎn),即:記錄調(diào)用該過(guò)程目標(biāo)程序的斷點(diǎn),即當(dāng)時(shí)的程序地址寄存器當(dāng)時(shí)的程序地址寄存器P的值。也就是調(diào)用過(guò)程指令的的值。也就是調(diào)用過(guò)程指令的下一條指令的地址下一條指令的地址vPL/OPL/O編譯程序給每個(gè)過(guò)程定義的變量在數(shù)據(jù)段內(nèi)分

18、配的編譯程序給每個(gè)過(guò)程定義的變量在數(shù)據(jù)段內(nèi)分配的相對(duì)位置是從相對(duì)位置是從3 3開(kāi)始順序增加。前面的三個(gè)單元為上面指開(kāi)始順序增加。前面的三個(gè)單元為上面指出的聯(lián)系單元出的聯(lián)系單元v具體的過(guò)程調(diào)用和結(jié)束,對(duì)上述寄存器及3個(gè)聯(lián)系單元的填寫(xiě)和恢復(fù)由下列目標(biāo)指令完成(1 1)INT 0 A(2)OPR 0 0(3)CAL L A 指令指令 “INT 0 A”- 在棧頂開(kāi)辟在棧頂開(kāi)辟 A 個(gè)存儲(chǔ)單元,服務(wù)于被調(diào)用的過(guò)程個(gè)存儲(chǔ)單元,服務(wù)于被調(diào)用的過(guò)程- A 等于該過(guò)程的等于該過(guò)程的局部變量數(shù)加局部變量數(shù)加 3- 3 個(gè)個(gè)特殊的特殊的聯(lián)系單元聯(lián)系單元類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 0”-

19、過(guò)程調(diào)用結(jié)束后過(guò)程調(diào)用結(jié)束后, ,返回調(diào)用點(diǎn)并退棧返回調(diào)用點(diǎn)并退棧- 重置基址寄存器和棧頂寄存器重置基址寄存器和棧頂寄存器類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “CAL L A”- 調(diào)用地址為調(diào)用地址為 A 的過(guò)程(置指令地址寄存器為的過(guò)程(置指令地址寄存器為A)- L 為調(diào)用過(guò)程與被調(diào)用過(guò)程的為調(diào)用過(guò)程與被調(diào)用過(guò)程的層差層差- 設(shè)置被調(diào)用過(guò)程的設(shè)置被調(diào)用過(guò)程的3 個(gè)聯(lián)系單元個(gè)聯(lián)系單元類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “LIT 0 A”- 立即數(shù)存入棧頂,即置立即數(shù)存入棧頂,即置T 所指存儲(chǔ)單元的值為所指存儲(chǔ)單元的值為A- T 加加 1 指令指令 “LOD L A”- 將層差為將層差為

20、L、偏移量為偏移量為A的存儲(chǔ)單元的值取到棧頂?shù)拇鎯?chǔ)單元的值取到棧頂- T 加加 1 指令指令 “STO L A”- T 減減 1- 將棧頂?shù)闹荡嫒雽硬顬閷m數(shù)闹荡嫒雽硬顬長(zhǎng)、偏移量為偏移量為A的存儲(chǔ)單元的存儲(chǔ)單元 注:注:層差為層差為L(zhǎng)、偏移量為偏移量為A的存儲(chǔ)單元,即沿當(dāng)前層靜的存儲(chǔ)單元,即沿當(dāng)前層靜 態(tài)鏈態(tài)鏈SL開(kāi)始向前第開(kāi)始向前第L層的層的SL作為基址,加上作為基址,加上A,即為該,即為該 單元的地址單元的地址類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 1”- 求棧頂元素的相反數(shù),結(jié)果值留在棧頂求棧頂元素的相反數(shù),結(jié)果值留在棧頂 指令指令 “OPR 0 6”- 棧頂元素的奇偶

21、判斷,若為奇數(shù),結(jié)果為棧頂元素的奇偶判斷,若為奇數(shù),結(jié)果為1;若為偶;若為偶 數(shù),結(jié)果為數(shù),結(jié)果為0 ;結(jié)果值留在棧頂;結(jié)果值留在棧頂類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 2”- 次棧頂與棧頂?shù)闹迪嗉?,結(jié)果存入次棧頂次棧頂與棧頂?shù)闹迪嗉?,結(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 3”- 次棧頂?shù)闹禍p去棧頂?shù)闹担Y(jié)果存入次棧頂次棧頂?shù)闹禍p去棧頂?shù)闹?,結(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 4”- 次棧頂?shù)闹党艘詶m數(shù)闹?,結(jié)果存入次棧頂次棧頂?shù)闹党艘詶m數(shù)闹?,結(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 5”- 次棧頂?shù)闹党詶m數(shù)闹担Y(jié)果存

22、入次棧頂次棧頂?shù)闹党詶m數(shù)闹?,結(jié)果存入次棧頂- T 減減 1類(lèi)類(lèi)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 指令指令 “OPR 0 10” 比較次棧頂是否小于棧頂比較次棧頂是否小于棧頂- 若小于,結(jié)果為若小于,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1 指令指令 “OP

23、R 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é)果為若小于等于,結(jié)果為0;存結(jié)果至次棧頂;存結(jié)果至次棧頂;T 減減1 1類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “JMP 0 A”- 無(wú)條件轉(zhuǎn)移至地址無(wú)條件轉(zhuǎn)移至地址 A,即置即

24、置指令地址寄存器為指令地址寄存器為A 指令指令 “JPC 0 A”- 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令- 若棧頂為若棧頂為 0,則轉(zhuǎn)移至地址則轉(zhuǎn)移至地址 A,即置指令地址寄存即置指令地址寄存 器為器為A類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 指令指令 “OPR 0 14”- 棧頂?shù)闹递敵鲋量刂婆_(tái)屏幕棧頂?shù)闹递敵鲋量刂婆_(tái)屏幕- T 減減 1 1 指令指令 “OPR 0 15”- 控制臺(tái)屏幕輸出一個(gè)換行控制臺(tái)屏幕輸出一個(gè)換行 指令指令 “OPR 0 16”- 從控制臺(tái)讀入一行輸入,置入棧頂從控制臺(tái)讀入一行輸入,置入棧頂- T 加加 1 1類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 類(lèi)類(lèi)P-code 解釋程序解釋程序- 數(shù)據(jù)結(jié)構(gòu)數(shù)

25、據(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; 棧頂寄存器棧頂寄存器 int t; 虛擬機(jī)代碼段虛擬機(jī)代碼段 struct instruction codecxmax;類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī) 類(lèi)類(lèi)P-code 解釋程序解釋程序- 處理流程處理流程 (1)初始化初始化 p=b=t=0;

26、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); 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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3

27、過(guò)程過(guò)程p入口入口,為過(guò)程為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)棧空間個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取

28、至棧頂?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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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 從命令行讀取值到棧頂從命令行讀取

29、值到棧頂(22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)btp 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p

30、入口入口,為過(guò)程為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹?/p>

31、取至棧頂(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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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 從命令行讀取值到棧頂從命令行讀取值到棧頂(

32、22) sto 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,

33、為過(guò)程為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)棧空間個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?

34、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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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) s

35、to 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt000 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)

36、程為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)棧空間個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12

37、) 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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

38、 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt0005 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)程

39、為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)棧空間個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12)

40、 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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

41、0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt0005 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)程為

42、過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12)

43、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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

44、 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt00055 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)程為

45、過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12)

46、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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

47、 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt000550 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)程

48、為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12)

49、 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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

50、0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt00051 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)程

51、為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12)

52、 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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

53、0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt0005 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為過(guò)程為

54、過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)棧空間( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?12)

55、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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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

56、 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt00050016 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入口,為

57、過(guò)程為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖m?1

58、2) 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)(條件不滿(mǎn)足轉(zhuǎn))(條件不滿(mǎn)足轉(zhuǎn))(15) cal 0 2 調(diào)用過(guò)程調(diào)用過(guò)程p(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) st

59、o 0 3 棧頂值送變量棧頂值送變量b中中(23) jmp 0 11 無(wú)條件轉(zhuǎn)到循環(huán)入口無(wú)條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類(lèi)類(lèi)P-code虛擬機(jī)虛擬機(jī)pbt00050016 例例const a=10;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)向過(guò)程轉(zhuǎn)向過(guò)程p入口入口( 2) int 0 3 過(guò)程過(guò)程p入口入

60、口,為過(guò)程為過(guò)程p開(kāi)辟空間開(kāi)辟空間( 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) int 0 5 主程序入口開(kāi)辟主程序入口開(kāi)辟5個(gè)??臻g個(gè)??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖?/p>

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論