![第十二章代碼生成新_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/b038f009-c508-400d-b3cf-d7b3f8687989/b038f009-c508-400d-b3cf-d7b3f86879891.gif)
![第十二章代碼生成新_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/b038f009-c508-400d-b3cf-d7b3f8687989/b038f009-c508-400d-b3cf-d7b3f86879892.gif)
![第十二章代碼生成新_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/b038f009-c508-400d-b3cf-d7b3f8687989/b038f009-c508-400d-b3cf-d7b3f86879893.gif)
![第十二章代碼生成新_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/b038f009-c508-400d-b3cf-d7b3f8687989/b038f009-c508-400d-b3cf-d7b3f86879894.gif)
![第十二章代碼生成新_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/b038f009-c508-400d-b3cf-d7b3f8687989/b038f009-c508-400d-b3cf-d7b3f86879895.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、LOGO1廣東工業(yè)大學(xué)計算機學(xué)院廣東工業(yè)大學(xué)計算機學(xué)院v PL/O編譯程序所產(chǎn)生的目標代碼是一個編譯程序所產(chǎn)生的目標代碼是一個假想棧式假想棧式計算機計算機的匯編語言,可稱為的匯編語言,可稱為類類PCODE指令代碼,它不依賴任何指令代碼,它不依賴任何實際計算機實際計算機v 此類棧式機沒有累加器和通用寄存器,此類棧式機沒有累加器和通用寄存器,有一個有一個棧式存儲棧式存儲器器,有四個控制寄存器(,有四個控制寄存器(指令寄存器指令寄存器 I,指令地址寄存器指令地址寄存器 P,棧頂寄存器棧頂寄存器 T和和基址寄存器基址寄存器 B),算邏運算都在棧頂),算邏運算都在棧頂進行。(這部分內(nèi)容涉及到進行。(這部
2、分內(nèi)容涉及到PL/0解釋程序)解釋程序)v 指令格式指令格式f l af l av 指令指令 “LIT 0 A”v LOD:將變量放到棧頂。:將變量放到棧頂。a域為變量在所說明層中的相對位置,域為變量在所說明層中的相對位置,l為調(diào)用層為調(diào)用層與說明層的層差值。與說明層的層差值。v STO:將棧頂?shù)膬?nèi)容送入某變量單元中。:將棧頂?shù)膬?nèi)容送入某變量單元中。a和和l域的含意同域的含意同LOD指令。指令。v CAL:調(diào)用過程的指令。:調(diào)用過程的指令。a為被調(diào)用過程的目標程序入口地址,為被調(diào)用過程的目標程序入口地址,l為層差。為層差。v INT:為被調(diào)用的過程:為被調(diào)用的過程(或主程序或主程序)在運行棧中
3、開辟數(shù)據(jù)區(qū)。在運行棧中開辟數(shù)據(jù)區(qū)。a域為開辟的單域為開辟的單元個數(shù)。元個數(shù)。v JMP:無條件轉(zhuǎn)移指令,:無條件轉(zhuǎn)移指令,a為轉(zhuǎn)向地址。為轉(zhuǎn)向地址。v JPC:條件轉(zhuǎn)移指令,當棧頂?shù)牟紶栔禐榉钦鏁r,轉(zhuǎn)向:條件轉(zhuǎn)移指令,當棧頂?shù)牟紶栔禐榉钦鏁r,轉(zhuǎn)向a域的地址,域的地址,否則順序執(zhí)行。否則順序執(zhí)行。v OPR:關(guān)系運算和算術(shù)運算指令。將棧頂和次棧頂?shù)膬?nèi)容進行運算:關(guān)系運算和算術(shù)運算指令。將棧頂和次棧頂?shù)膬?nèi)容進行運算,結(jié)果存放在次棧頂。此外還可以是讀寫等特殊功能的指令,具體,結(jié)果存放在次棧頂。此外還可以是讀寫等特殊功能的指令,具體操作由操作由a域值給出。(域值給出。(P23)v 編譯程序的目標代碼生
4、成編譯程序的目標代碼生成v lev:當前:當前處理的處理的過程過程層次層次v level:被引用變量或過程所在:被引用變量或過程所在層次層次v CX:為目標代碼:為目標代碼code數(shù)組的下標指針(數(shù)組的下標指針(CX為指令的為指令的指針,由指針,由0開始順序增加。)開始順序增加。)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ù)。每一個記錄為一維數(shù)組,數(shù)組元素為記錄型數(shù)據(jù)。每一個記錄就是一條目標指令。就是一條目標指令。v實際上目標代碼的順序是內(nèi)層過程的排在前邊,主程序?qū)嶋H上目標代碼的順序是內(nèi)層過程的排在前邊,主程序的目標代碼在最后。的目標代碼在最后。v 下面我們給出一個PL/0源程序和對應(yīng)的目標程序的清單。 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)向過程過程p p入口入口( 2) int 0 3 ( 2) int 0 3 過程過程p p入口入口, ,為過程為過程p p開辟空間開辟空間( 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ào)用點(16)(16)( 8) int 0 5 ( 8) int 0 5 主程序入口開辟主程序入口開辟5 5個??臻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進棧進棧(13) opr 0 9 (13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) (14) jpc 0 24jpc 0 24 等時轉(zhuǎn)等時轉(zhuǎn)(24)(24)(條件不滿足轉(zhuǎn)條件不滿足轉(zhuǎn))(15) cal 0 2 (15) cal 0 2 調(diào)用過程調(diào)用過程p p(16) lit 0 2 (16) lit 0 2 常數(shù)值常數(shù)值2 2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(1
10、1)(11)(24) opr 0 0 (24) opr 0 0 結(jié)束退棧結(jié)束退棧v 對于過程對于過程(分程序分程序)的代碼生成的代碼生成 在在block入口處生成一條入口處生成一條(jmp,0,0)指令,作為過程體入口指令,指令,作為過程體入口指令,該指令的第該指令的第3區(qū)域的區(qū)域的0需分析到過程體入口時才返填。需分析到過程體入口時才返填。v 對分程序體入口的處理(見程序文本對分程序體入口的處理(見程序文本P424頁頁block 的過程體)的過程體)begin (*block*)dx:=3;tx0:=tx; v (*保留當前保留當前table表指針值表指針值,實際為過程名在實際為過程名在tab
11、le表中的位表中的位置置*)tabletx.adr:=cx;(*保留當前保留當前code指針值到過程名的指針值到過程名的adr域域*) gen(jmp,0,0);(上例的前二行!上例的前二行?。﹙ 其實上述內(nèi)容最重要的是地址的回填(見下幾頁其實上述內(nèi)容最重要的是地址的回填(見下幾頁PPT)錄過程在code的入口到table中的adr域如下表所示: (*生成轉(zhuǎn)向過程體入口的指令,該指令的地址為生成轉(zhuǎn)向過程體入口的指令,該指令的地址為cx已保留在過程名的已保留在過程名的adr域,域,真正的過程體入口地址,等生成過程體入口的指令時,將過程體入口返填真正的過程體入口地址,等生成過程體入口的指令時,將過
12、程體入口返填(jmp,0,0)的第)的第3區(qū)域,同時填到區(qū)域,同時填到tabletx0.adr 中中*)tx0tx0:=tx;tabletx.adr:=cx;txtable表格管理 codetabletx0.adr.a:=cx;tx0txtabletx0.adr=cx過程體入口時的處理 table表格管理 codetabletx0.adr.a:=cx;(cx為過程入口地址,填寫在為過程入口地址,填寫在code中)中)with tabletx0 do begin adr:=cx; (tabletx0.adr=cx)size:=dx; (tabletx0.sizedx)end;請?zhí)貏e注意請?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); /無條件跳轉(zhuǎn)無條件跳轉(zhuǎn), 轉(zhuǎn)到轉(zhuǎn)到L1CODECX
14、2.A=CX; /回填回填L2break; switch (SYM) While B Do SBFalseS轉(zhuǎn)L1L1:L2 :CX1CX2v 附錄附錄v 當源程序經(jīng)過語法分析,如果未發(fā)現(xiàn)錯誤時,由編譯程當源程序經(jīng)過語法分析,如果未發(fā)現(xiàn)錯誤時,由編譯程序調(diào)用解釋程序序調(diào)用解釋程序,對目標代碼開始進行解釋執(zhí)行。對目標代碼開始進行解釋執(zhí)行。v PL/0解釋程序解釋程序PL/0PL/0解釋程序的存儲分配解釋程序的存儲分配v存儲區(qū)存儲區(qū): :v數(shù)組數(shù)組CODECODE存放目標程序存放目標程序v運行時的數(shù)據(jù)區(qū)運行時的數(shù)據(jù)區(qū)S SvS S是由解釋程序定義的一維整型數(shù)組是由解釋程序定義的一維整型數(shù)組v由于由
15、于PL/OPL/O語言的目標程序是一種假想的棧式計算機的匯語言的目標程序是一種假想的棧式計算機的匯編語言,現(xiàn)仍用編語言,現(xiàn)仍用PascalPascal語言解釋執(zhí)行語言解釋執(zhí)行 PL/0解釋程序v 解釋程序定義了解釋程序定義了4個寄存器:個寄存器:v I指令寄存器指令寄存器:存放當前正在解釋的一條目標指令存放當前正在解釋的一條目標指令v P程序地址寄存器程序地址寄存器:指向下一條要執(zhí)行的目標程序的指向下一條要執(zhí)行的目標程序的v 地址(相當目標程序地址(相當目標程序CODE數(shù)組的下標)數(shù)組的下標)T棧頂寄存器棧頂寄存器。指向當前棧中最新分配的單元(。指向當前棧中最新分配的單元(T也是也是數(shù)組數(shù)組S
16、的下標)。的下標)。 每個過程當它被調(diào)用時,給它分配的數(shù)據(jù)空間(下邊稱每個過程當它被調(diào)用時,給它分配的數(shù)據(jù)空間(下邊稱數(shù)據(jù)段)可分成兩部分:數(shù)據(jù)段)可分成兩部分:靜態(tài)部分:包括變量存放區(qū)和三個聯(lián)系單元靜態(tài)部分:包括變量存放區(qū)和三個聯(lián)系單元動態(tài)部分:作為臨時工作單元和累加器用。需要時隨動態(tài)部分:作為臨時工作單元和累加器用。需要時隨時分配,用完后立即釋放時分配,用完后立即釋放B基址寄存器基址寄存器。指向當前執(zhí)行過程的在數(shù)據(jù)區(qū)。指向當前執(zhí)行過程的在數(shù)據(jù)區(qū)S中中給該過程分配的數(shù)據(jù)段起始地址,稱基地址給該過程分配的數(shù)據(jù)段起始地址,稱基地址v當過程被調(diào)用時,在棧頂分配三個聯(lián)系單元,這三個聯(lián)當過程被調(diào)用時,
17、在棧頂分配三個聯(lián)系單元,這三個聯(lián)系單元存放的內(nèi)容分別為:系單元存放的內(nèi)容分別為:SL靜態(tài)鏈靜態(tài)鏈:指向定義該過程的:指向定義該過程的直接外過程直接外過程(或主程序(或主程序)運行時最新數(shù)據(jù)段的基地址)運行時最新數(shù)據(jù)段的基地址DL動態(tài)鏈動態(tài)鏈:指向調(diào)用該過程前:指向調(diào)用該過程前正在運行過程正在運行過程的數(shù)據(jù)段的數(shù)據(jù)段基地址基地址RA返回地址返回地址:記錄調(diào)用該過程目標程序的斷點,即:記錄調(diào)用該過程目標程序的斷點,即當時的程序地址寄存器當時的程序地址寄存器P的值。也就是調(diào)用過程指令的的值。也就是調(diào)用過程指令的下一條指令的地址下一條指令的地址vPL/OPL/O編譯程序給每個過程定義的變量在數(shù)據(jù)段內(nèi)分
18、配的編譯程序給每個過程定義的變量在數(shù)據(jù)段內(nèi)分配的相對位置是從相對位置是從3 3開始順序增加。前面的三個單元為上面指開始順序增加。前面的三個單元為上面指出的聯(lián)系單元出的聯(lián)系單元v具體的過程調(diào)用和結(jié)束,對上述寄存器及3個聯(lián)系單元的填寫和恢復(fù)由下列目標指令完成(1 1)INT 0 A(2)OPR 0 0(3)CAL L A 指令指令 “INT 0 A”- 在棧頂開辟在棧頂開辟 A 個存儲單元,服務(wù)于被調(diào)用的過程個存儲單元,服務(wù)于被調(diào)用的過程- A 等于該過程的等于該過程的局部變量數(shù)加局部變量數(shù)加 3- 3 個個特殊的特殊的聯(lián)系單元聯(lián)系單元類類P-code虛擬機虛擬機 指令指令 “OPR 0 0”-
19、過程調(diào)用結(jié)束后過程調(diào)用結(jié)束后, ,返回調(diào)用點并退棧返回調(diào)用點并退棧- 重置基址寄存器和棧頂寄存器重置基址寄存器和棧頂寄存器類類P-code虛擬機虛擬機 指令指令 “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 個聯(lián)系單元個聯(lián)系單元類類P-code虛擬機虛擬機 指令指令 “LIT 0 A”- 立即數(shù)存入棧頂,即置立即數(shù)存入棧頂,即置T 所指存儲單元的值為所指存儲單元的值為A- T 加加 1 指令指令 “LOD L A”- 將層差為將層差為
20、L、偏移量為偏移量為A的存儲單元的值取到棧頂?shù)拇鎯卧闹等〉綏m? T 加加 1 指令指令 “STO L A”- T 減減 1- 將棧頂?shù)闹荡嫒雽硬顬閷m數(shù)闹荡嫒雽硬顬長、偏移量為偏移量為A的存儲單元的存儲單元 注:注:層差為層差為L、偏移量為偏移量為A的存儲單元,即沿當前層靜的存儲單元,即沿當前層靜 態(tài)鏈態(tài)鏈SL開始向前第開始向前第L層的層的SL作為基址,加上作為基址,加上A,即為該,即為該 單元的地址單元的地址類類P-code虛擬機虛擬機 指令指令 “OPR 0 1”- 求棧頂元素的相反數(shù),結(jié)果值留在棧頂求棧頂元素的相反數(shù),結(jié)果值留在棧頂 指令指令 “OPR 0 6”- 棧頂元素的奇偶
21、判斷,若為奇數(shù),結(jié)果為棧頂元素的奇偶判斷,若為奇數(shù),結(jié)果為1;若為偶;若為偶 數(shù),結(jié)果為數(shù),結(jié)果為0 ;結(jié)果值留在棧頂;結(jié)果值留在棧頂類類P-code虛擬機虛擬機 指令指令 “OPR 0 2”- 次棧頂與棧頂?shù)闹迪嗉?,結(jié)果存入次棧頂次棧頂與棧頂?shù)闹迪嗉?,結(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 3”- 次棧頂?shù)闹禍p去棧頂?shù)闹?,結(jié)果存入次棧頂次棧頂?shù)闹禍p去棧頂?shù)闹?,結(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 4”- 次棧頂?shù)闹党艘詶m數(shù)闹?,結(jié)果存入次棧頂次棧頂?shù)闹党艘詶m數(shù)闹担Y(jié)果存入次棧頂- T 減減 1 指令指令 “OPR 0 5”- 次棧頂?shù)闹党詶m數(shù)闹?,結(jié)果存
22、入次棧頂次棧頂?shù)闹党詶m數(shù)闹?,結(jié)果存入次棧頂- T 減減 1類類P-code虛擬機虛擬機 指令指令 “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類類P-code虛擬機虛擬機 指令指令 “JMP 0 A”- 無條件轉(zhuǎn)移至地址無條件轉(zhuǎn)移至地址 A,即置即
24、置指令地址寄存器為指令地址寄存器為A 指令指令 “JPC 0 A”- 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令- 若棧頂為若棧頂為 0,則轉(zhuǎn)移至地址則轉(zhuǎn)移至地址 A,即置指令地址寄存即置指令地址寄存 器為器為A類類P-code虛擬機虛擬機 指令指令 “OPR 0 14”- 棧頂?shù)闹递敵鲋量刂婆_屏幕棧頂?shù)闹递敵鲋量刂婆_屏幕- T 減減 1 1 指令指令 “OPR 0 15”- 控制臺屏幕輸出一個換行控制臺屏幕輸出一個換行 指令指令 “OPR 0 16”- 從控制臺讀入一行輸入,置入棧頂從控制臺讀入一行輸入,置入棧頂- T 加加 1 1類類P-code虛擬機虛擬機 類類P-code 解釋程序解釋程序- 數(shù)據(jù)結(jié)構(gòu)數(shù)
25、據(jù)結(jié)構(gòu) 運行棧運行棧 int sstacksize 指令寄存器指令寄存器 struct instruction enum fct f; /*操作碼操作碼*/ int l; /*引用層與聲明層的層差引用層與聲明層的層差*/ int a; /*因不同的因不同的f各異各異*/ i 指令地址寄存器指令地址寄存器 int p; 基址寄存器基址寄存器 int b; 棧頂寄存器棧頂寄存器 int t; 虛擬機代碼段虛擬機代碼段 struct instruction codecxmax;類類P-code虛擬機虛擬機 類類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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3
27、過程過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p
30、入口入口,為過程為過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,
33、為過程為過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過
36、程為過程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ào)用點(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
37、) lit 0 0 將常數(shù)值將常數(shù)值0進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程
39、為過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個棧空間個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為
42、過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為
45、過程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ào)用點(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)
46、lit 0 0 將常數(shù)值將常數(shù)值0進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程
48、為過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個棧空間個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程
51、為過程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ào)用點(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)
52、 lit 0 0 將常數(shù)值將常數(shù)值0進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為過程為
54、過程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ào)用點(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)
55、lit 0 0 將常數(shù)值將常數(shù)值0進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入口,為
57、過程為過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個棧空間個??臻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進棧進棧(13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) jpc 0 24 相等時轉(zhuǎn)相等時轉(zhuǎn)(24)(條件不滿足轉(zhuǎn))(條件不滿足轉(zhuǎn))(15) cal 0 2 調(diào)用過程調(diào)用過程p(16) lit 0 2 常數(shù)值常數(shù)值2進棧進棧(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 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(24) opr 0 0 結(jié)束退棧結(jié)束退棧類類P-code虛擬機虛擬機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)向過程轉(zhuǎn)向過程p入口入口( 2) int 0 3 過程過程p入口入
60、口,為過程為過程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ào)用點(16)( 8) int 0 5 主程序入口開辟主程序入口開辟5個棧空間個??臻g( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b中中(11) lod 0 3 將變量將變量b的值取至棧頂?shù)闹等≈翖?/p>
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 凍庫購銷合同范例
- 臨時高空作業(yè)合同范例
- 儀器轉(zhuǎn)讓合同范本
- 基礎(chǔ)代運營合同范例
- 農(nóng)用機械合作合同范例
- 住房清包合同范本
- 協(xié)理證出租合同范本
- CG外包合同范例
- 會議活動安保合同范例
- 合同范例交流論壇
- 湖南省長沙市一中2024-2025學(xué)年高一生物上學(xué)期期末考試試題含解析
- 碳纖維增強復(fù)合材料在海洋工程中的應(yīng)用情況
- 小孩使用手機協(xié)議書范本
- 公司市場分析管理制度
- 焊接材料制造工-國家職業(yè)標準(2024版)
- 江西省2024年中考數(shù)學(xué)試卷(含答案)
- 榆神礦區(qū)郭家灘煤礦(700 萬噸-年)項目環(huán)評
- 2024年200MW-400MWh電化學(xué)儲能電站設(shè)計方案
- 余土外運施工方案
- DB32-T 186-2015建筑消防設(shè)施檢測技術(shù)規(guī)程
- 中考英語1600詞匯對照表-(帶音標)
評論
0/150
提交評論