第12章 代码生成new_第1页
第12章 代码生成new_第2页
第12章 代码生成new_第3页
第12章 代码生成new_第4页
第12章 代码生成new_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LOGO1广东工业大学计算机学院广东工业大学计算机学院v PL/O编译程序所产生的目标代码是一个编译程序所产生的目标代码是一个假想栈式假想栈式计算机计算机的汇编语言,可称为的汇编语言,可称为类类PCODE指令代码,它不依赖任何指令代码,它不依赖任何实际计算机实际计算机v 此类栈式机没有累加器和通用寄存器,此类栈式机没有累加器和通用寄存器,有一个有一个栈式存储栈式存储器器,有四个控制寄存器(,有四个控制寄存器(指令寄存器指令寄存器 I,指令地址寄存器指令地址寄存器 P,栈顶寄存器栈顶寄存器 T和和基址寄存器基址寄存器 B),算逻运算都在栈顶),算逻运算都在栈顶进行。(这部分内容涉及到进行。(这部

2、分内容涉及到PL/0解释程序)解释程序)v 指令格式指令格式f l af l av 指令指令 “LIT 0 A”v LOD:将变量放到栈顶。:将变量放到栈顶。a域为变量在所说明层中的相对位置,域为变量在所说明层中的相对位置,l为调用层为调用层与说明层的层差值。与说明层的层差值。v STO:将栈顶的内容送入某变量单元中。:将栈顶的内容送入某变量单元中。a和和l域的含意同域的含意同LOD指令。指令。v CAL:调用过程的指令。:调用过程的指令。a为被调用过程的目标程序入口地址,为被调用过程的目标程序入口地址,l为层差。为层差。v INT:为被调用的过程:为被调用的过程(或主程序或主程序)在运行栈中

3、开辟数据区。在运行栈中开辟数据区。a域为开辟的单域为开辟的单元个数。元个数。v JMP:无条件转移指令,:无条件转移指令,a为转向地址。为转向地址。v JPC:条件转移指令,当栈顶的布尔值为非真时,转向:条件转移指令,当栈顶的布尔值为非真时,转向a域的地址,域的地址,否则顺序执行。否则顺序执行。v OPR:关系运算和算术运算指令。将栈顶和次栈顶的内容进行运算:关系运算和算术运算指令。将栈顶和次栈顶的内容进行运算,结果存放在次栈顶。此外还可以是读写等特殊功能的指令,具体,结果存放在次栈顶。此外还可以是读写等特殊功能的指令,具体操作由操作由a域值给出。(域值给出。(P23)v 编译程序的目标代码生

4、成编译程序的目标代码生成v lev:当前:当前处理的处理的过程过程层次层次v level:被引用变量或过程所在:被引用变量或过程所在层次层次v CX:为目标代码:为目标代码code数组的下标指针(数组的下标指针(CX为指令的为指令的指针,由指针,由0开始顺序增加。)开始顺序增加。)v 相关定义相关定义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为一维数组,数组元素为记录型数据。每一个记录为一维数组,数组元素为记录型数据。每一个记录就是一条目标指令。就是一条目标指令。v实际上目标代码的顺序是内层过程的排在前边,主程序实际上目标代码的顺序是内层过程的排在前边,主程序的目标代码在最后。的目标代码在最后。v 下面我们给出一个PL/0源程序和对应的目标程序的清单。 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 转向转向主程序入口主程序入口( 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) lod 1 3 取变量取变量b b的值到栈顶的值到栈顶( 4) li

7、t 0 10 ( 4) lit 0 10 取常数取常数1010到栈顶到栈顶( 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个栈空间个栈空间( 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的值取至栈顶的值取至栈顶(12) lit 0 0 (12) lit 0 0 将常数值将常数值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 0 2 常数值常数值2 2进栈进栈(17) lod (17) l

9、od 0 0 4 4 将变量将变量c c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(1

10、1)(11)(24) opr 0 0 (24) opr 0 0 结束退栈结束退栈v 对于过程对于过程(分程序分程序)的代码生成的代码生成 在在block入口处生成一条入口处生成一条(jmp,0,0)指令,作为过程体入口指令,指令,作为过程体入口指令,该指令的第该指令的第3区域的区域的0需分析到过程体入口时才返填。需分析到过程体入口时才返填。v 对分程序体入口的处理(见程序文本对分程序体入口的处理(见程序文本P424页页block 的过程体)的过程体)begin (*block*)dx:=3;tx0:=tx; v (*保留当前保留当前table表指针值表指针值,实际为过程名在实际为过程名在tab

11、le表中的位表中的位置置*)tabletx.adr:=cx;(*保留当前保留当前code指针值到过程名的指针值到过程名的adr域域*) gen(jmp,0,0);(上例的前二行!上例的前二行!)v 其实上述内容最重要的是地址的回填(见下几页其实上述内容最重要的是地址的回填(见下几页PPT)录过程在code的入口到table中的adr域如下表所示: (*生成转向过程体入口的指令,该指令的地址为生成转向过程体入口的指令,该指令的地址为cx已保留在过程名的已保留在过程名的adr域,域,真正的过程体入口地址,等生成过程体入口的指令时,将过程体入口返填真正的过程体入口地址,等生成过程体入口的指令时,将过

12、程体入口返填(jmp,0,0)的第)的第3区域,同时填到区域,同时填到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;请特别注意请特别注意

13、dx、 tx、 cx的作用和如何处理信息之间的连的作用和如何处理信息之间的连接关系。接关系。 CASE WHILESYM:CX1=CX; GetSym(); /保留保留L1的地址的地址 CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX); /生成生成B的代码的代码CX2=CX; GEN(JPC,0,0);/条件跳转条件跳转, L2待定待定,if (SYM=DOSYM) GetSym();else Error(18);STATEMENT(FSYS,LEV,TX);/生成生成S的代码的代码GEN(JMP,0,CX1); /无条件跳转无条件跳转, 转到转到L1CODECX

14、2.A=CX; /回填回填L2break; switch (SYM) While B Do SBFalseS转L1L1:L2 :CX1CX2v 附录附录v 当源程序经过语法分析,如果未发现错误时,由编译程当源程序经过语法分析,如果未发现错误时,由编译程序调用解释程序序调用解释程序,对目标代码开始进行解释执行。对目标代码开始进行解释执行。v PL/0解释程序解释程序PL/0PL/0解释程序的存储分配解释程序的存储分配v存储区存储区: :v数组数组CODECODE存放目标程序存放目标程序v运行时的数据区运行时的数据区S SvS S是由解释程序定义的一维整型数组是由解释程序定义的一维整型数组v由于由

15、于PL/OPL/O语言的目标程序是一种假想的栈式计算机的汇语言的目标程序是一种假想的栈式计算机的汇编语言,现仍用编语言,现仍用PascalPascal语言解释执行语言解释执行 PL/0解释程序v 解释程序定义了解释程序定义了4个寄存器:个寄存器:v I指令寄存器指令寄存器:存放当前正在解释的一条目标指令存放当前正在解释的一条目标指令v P程序地址寄存器程序地址寄存器:指向下一条要执行的目标程序的指向下一条要执行的目标程序的v 地址(相当目标程序地址(相当目标程序CODE数组的下标)数组的下标)T栈顶寄存器栈顶寄存器。指向当前栈中最新分配的单元(。指向当前栈中最新分配的单元(T也是也是数组数组S

16、的下标)。的下标)。 每个过程当它被调用时,给它分配的数据空间(下边称每个过程当它被调用时,给它分配的数据空间(下边称数据段)可分成两部分:数据段)可分成两部分:静态部分:包括变量存放区和三个联系单元静态部分:包括变量存放区和三个联系单元动态部分:作为临时工作单元和累加器用。需要时随动态部分:作为临时工作单元和累加器用。需要时随时分配,用完后立即释放时分配,用完后立即释放B基址寄存器基址寄存器。指向当前执行过程的在数据区。指向当前执行过程的在数据区S中中给该过程分配的数据段起始地址,称基地址给该过程分配的数据段起始地址,称基地址v当过程被调用时,在栈顶分配三个联系单元,这三个联当过程被调用时,

17、在栈顶分配三个联系单元,这三个联系单元存放的内容分别为:系单元存放的内容分别为:SL静态链静态链:指向定义该过程的:指向定义该过程的直接外过程直接外过程(或主程序(或主程序)运行时最新数据段的基地址)运行时最新数据段的基地址DL动态链动态链:指向调用该过程前:指向调用该过程前正在运行过程正在运行过程的数据段的数据段基地址基地址RA返回地址返回地址:记录调用该过程目标程序的断点,即:记录调用该过程目标程序的断点,即当时的程序地址寄存器当时的程序地址寄存器P的值。也就是调用过程指令的的值。也就是调用过程指令的下一条指令的地址下一条指令的地址vPL/OPL/O编译程序给每个过程定义的变量在数据段内分

18、配的编译程序给每个过程定义的变量在数据段内分配的相对位置是从相对位置是从3 3开始顺序增加。前面的三个单元为上面指开始顺序增加。前面的三个单元为上面指出的联系单元出的联系单元v具体的过程调用和结束,对上述寄存器及3个联系单元的填写和恢复由下列目标指令完成(1 1)INT 0 A(2)OPR 0 0(3)CAL L A 指令指令 “INT 0 A”- 在栈顶开辟在栈顶开辟 A 个存储单元,服务于被调用的过程个存储单元,服务于被调用的过程- A 等于该过程的等于该过程的局部变量数加局部变量数加 3- 3 个个特殊的特殊的联系单元联系单元类类P-code虚拟机虚拟机 指令指令 “OPR 0 0”-

19、过程调用结束后过程调用结束后, ,返回调用点并退栈返回调用点并退栈- 重置基址寄存器和栈顶寄存器重置基址寄存器和栈顶寄存器类类P-code虚拟机虚拟机 指令指令 “CAL L A”- 调用地址为调用地址为 A 的过程(置指令地址寄存器为的过程(置指令地址寄存器为A)- L 为调用过程与被调用过程的为调用过程与被调用过程的层差层差- 设置被调用过程的设置被调用过程的3 个联系单元个联系单元类类P-code虚拟机虚拟机 指令指令 “LIT 0 A”- 立即数存入栈顶,即置立即数存入栈顶,即置T 所指存储单元的值为所指存储单元的值为A- T 加加 1 指令指令 “LOD L A”- 将层差为将层差为

20、L、偏移量为偏移量为A的存储单元的值取到栈顶的存储单元的值取到栈顶- T 加加 1 指令指令 “STO L A”- T 减减 1- 将栈顶的值存入层差为将栈顶的值存入层差为L、偏移量为偏移量为A的存储单元的存储单元 注:注:层差为层差为L、偏移量为偏移量为A的存储单元,即沿当前层静的存储单元,即沿当前层静 态链态链SL开始向前第开始向前第L层的层的SL作为基址,加上作为基址,加上A,即为该,即为该 单元的地址单元的地址类类P-code虚拟机虚拟机 指令指令 “OPR 0 1”- 求栈顶元素的相反数,结果值留在栈顶求栈顶元素的相反数,结果值留在栈顶 指令指令 “OPR 0 6”- 栈顶元素的奇偶

21、判断,若为奇数,结果为栈顶元素的奇偶判断,若为奇数,结果为1;若为偶;若为偶 数,结果为数,结果为0 ;结果值留在栈顶;结果值留在栈顶类类P-code虚拟机虚拟机 指令指令 “OPR 0 2”- 次栈顶与栈顶的值相加,结果存入次栈顶次栈顶与栈顶的值相加,结果存入次栈顶- T 减减 1 指令指令 “OPR 0 3”- 次栈顶的值减去栈顶的值,结果存入次栈顶次栈顶的值减去栈顶的值,结果存入次栈顶- T 减减 1 指令指令 “OPR 0 4”- 次栈顶的值乘以栈顶的值,结果存入次栈顶次栈顶的值乘以栈顶的值,结果存入次栈顶- T 减减 1 指令指令 “OPR 0 5”- 次栈顶的值除以栈顶的值,结果存

22、入次栈顶次栈顶的值除以栈顶的值,结果存入次栈顶- T 减减 1类类P-code虚拟机虚拟机 指令指令 “OPR 0 8” 比较次栈顶与栈顶是否相等比较次栈顶与栈顶是否相等- 若相等,结果为若相等,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 9” 比较次栈顶与栈顶是否不相等比较次栈顶与栈顶是否不相等- 若不相等,结果为若不相等,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 10” 比较次栈顶是否小于栈顶比较次栈顶是否小于栈顶- 若小于,结果为若小于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OP

23、R 0 11” 比较次栈顶是否大于等于栈顶比较次栈顶是否大于等于栈顶- 若大于等于,结果为若大于等于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 12” 比较次栈顶是否大于栈顶比较次栈顶是否大于栈顶- 若大于,结果为若大于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1 指令指令 “OPR 0 13” 比较次栈顶是否小于等于栈顶比较次栈顶是否小于等于栈顶- 若小于等于,结果为若小于等于,结果为0;存结果至次栈顶;存结果至次栈顶;T 减减1 1类类P-code虚拟机虚拟机 指令指令 “JMP 0 A”- 无条件转移至地址无条件转移至地址 A,即置即

24、置指令地址寄存器为指令地址寄存器为A 指令指令 “JPC 0 A”- 条件转移指令条件转移指令- 若栈顶为若栈顶为 0,则转移至地址则转移至地址 A,即置指令地址寄存即置指令地址寄存 器为器为A类类P-code虚拟机虚拟机 指令指令 “OPR 0 14”- 栈顶的值输出至控制台屏幕栈顶的值输出至控制台屏幕- T 减减 1 1 指令指令 “OPR 0 15”- 控制台屏幕输出一个换行控制台屏幕输出一个换行 指令指令 “OPR 0 16”- 从控制台读入一行输入,置入栈顶从控制台读入一行输入,置入栈顶- T 加加 1 1类类P-code虚拟机虚拟机 类类P-code 解释程序解释程序- 数据结构数

25、据结构 运行栈运行栈 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)分析并解释执行指令分析并解释执行指令 i (4)若程序未结束(若程序未结束(p != 0),),转转(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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3

27、过程过程p入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取

28、至栈顶的值取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p

30、入口入口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值

31、取至栈顶(12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,

33、为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(

34、12) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过

36、程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12

37、) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程

39、为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12)

40、 lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为

42、过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12)

43、lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为

45、过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12)

46、lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程

48、为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12)

49、 lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程

51、为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12)

52、 lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为过程为

54、过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(12)

55、lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入口,为

57、过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈顶(1

58、2) lit 0 0 将常数值将常数值0进栈进栈(13) opr 0 9 次栈顶与栈顶是否不等次栈顶与栈顶是否不等(14) jpc 0 24 相等时转相等时转(24)(条件不满足转)(条件不满足转)(15) cal 0 2 调用过程调用过程p(16) lit 0 2 常数值常数值2进栈进栈(17) lod 0 4 将变量将变量c的值取至栈顶的值取至栈顶(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 无条件转到循环入口无条件转到循环入口(11)(24) opr 0 0 结束退栈结束退栈类类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 转向主程序入口转向主程序入口( 1) jmp 0 2 转向过程转向过程p入口入口( 2) int 0 3 过程过程p入口入

60、口,为过程为过程p开辟空间开辟空间( 3) lod 1 3 取变量取变量b的值到栈顶的值到栈顶( 4) lit 0 10 取常数取常数10到栈顶到栈顶( 5) opr 0 2 次栈顶与栈顶相加次栈顶与栈顶相加( 6) sto 1 4 栈顶值送变量栈顶值送变量c中中( 7) opr 0 0 退栈并返回调用点退栈并返回调用点(16)( 8) int 0 5 主程序入口开辟主程序入口开辟5个栈空间个栈空间( 9) opr 0 16 从命令行读入值置于栈顶从命令行读入值置于栈顶(10) sto 0 3 将栈顶值存入变量将栈顶值存入变量b中中(11) lod 0 3 将变量将变量b的值取至栈顶的值取至栈

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论