编译原理第14章-pl0.ppt_第1页
编译原理第14章-pl0.ppt_第2页
编译原理第14章-pl0.ppt_第3页
编译原理第14章-pl0.ppt_第4页
编译原理第14章-pl0.ppt_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

PL 0编译程序导读 课外材料 PL 0编译程序总体结构 PL 0语言简介 PL 0编译程序的词法分析 类P code虚拟机 PL 0编译程序导读 PL 0编译程序的语法分析 PL 0编译程序的语义分析 PL 0编译程序的错误处理 PL 0编译程序的类P code代码生成 PL 0编译程序总体结构 T 型图 PL 0编译程序总体结构 PL 0编译程序的组织 一个以语法 语义分析程序为中心的单遍编译程序 PL 0语言简介 PL 0语言为一种简化的类Pascal语言PL 0程序示例PL 0语言的语法描述图PL 0语言的EBNF表示PL 0语言的语义规则 PL 0程序示例 PL 0程序示例 varm n r q 计算m和n的最大公约数 proceduregcd beginwhiler 0dobeginq m n r m q n m n n r endend beginread m read n 为了方便 规定m n ifm nthenbeginr m m n n r end beginr 1 callgcd write m end end 计算最大公约数 PL 0程序示例 varn m fact sum 递归计算fact m procedurefactorial beginifm 0thenbeginfact fact m m m 1 callfactorial end end begin 读入n read n sum 0 whilen 0dobeginm n fact 1 callfactorial sum sum fact n n 1 end 输出n write sum end 计算sum 1 2 n n从控制台读入 PL 0语言的语法描述图 每个语法单位对应一个语法描述图一个入口和一个出口的有向图从入口可到达任何节点每个节点都可以到达出口从入口到出口的路径表示该语法单位的一种合法中间形式 短语 有两种类型的节点 PL 0语言的语法描述图 例 程序和分程序语法单位的语法描述图 分程序 const ident number var ident procedure ident 分程序 语句 PL 0语言的EBNF表示 EBNF的元符号 是用左右尖括号括起来的中文字表示语法构造成分 或称语法单位 为非终结符 该符号的左部由右部定义 可读作 定义为 表示 或 即左部可由多个右部定义 表示花括号内的语法成分可以重复 在不加上下界时可重复0到任意次数 有上下界时为可重复次数的限制 表示方括号内的成分为任选项 表示圆括号内的成分优先 例 PL 0语言的EBNF表示 CONST VAR PROCEDURE PL 0语言的EBNF表示 例 PL 0语言的EBNF表示 BEGIN END ODD PL 0语言的EBNF表示 例 PL 0语言的EBNF表示 IFTHEN CALL WHILEDO READ WRITE a b X Y Z 0 1 2 8 9 PL 0语言的EBNF表示 PL 0语言的语义规则 类型 上下文约束与作用域规则数据类型只有整数类型数据结构只支持简单变量和常数所支持的数字为最长9位的十进制数标识符的有效长度为10标识符引用前先要声明过程无参数过程可嵌套 最多嵌套3层过程可递归调用内层过程可以引用包围它的外层过程的标识符 类P code虚拟机 类P code虚拟机 类P code语言一种栈式机的语言此类栈式机没有累加器和通用寄存器 有一个栈式存储器 有四个控制寄存器 指令寄存器I 指令地址寄存器P 栈顶寄存器T和基址寄存器B 算逻运算都在栈顶进行指令格式 f 操作码l 层次差 标识符引用层减去定义层 a 不同的指令含义不同 类P code虚拟机 指令 INT0A 在栈顶开辟A个存储单元 服务于被调用的过程A等于该过程的局部变量数加33个特殊的联系单元 类P code虚拟机 指令 OPR00 过程调用结束后 返回调用点并退栈重置基址寄存器和栈顶寄存器 类P code虚拟机 指令 CALLA 调用地址为A的过程 置指令地址寄存器为A L为调用过程与被调用过程的层差设置被调用过程的3个联系单元 类P code虚拟机 指令 LIT0A 立即数存入栈顶 即置T所指存储单元的值为AT加1 指令 LODLA 将层差为L 偏移量为A的存储单元的值取到栈顶T加1 指令 STOLA T减1将栈顶的值存入层差为L 偏移量为A的存储单元 注 层差为L 偏移量为A的存储单元 即沿当前层静态链SL开始向前第L层的SL作为基址 加上A 即为该单元的地址 类P code虚拟机 指令 OPR01 求栈顶元素的相反数 结果值留在栈顶 指令 OPR06 栈顶元素的奇偶判断 若为奇数 结果为1 若为偶数 结果为0 结果值留在栈顶 类P code虚拟机 指令 OPR02 次栈顶与栈顶的值相加 结果存入次栈顶T减1 指令 OPR03 次栈顶的值减去栈顶的值 结果存入次栈顶T减1 指令 OPR04 次栈顶的值乘以栈顶的值 结果存入次栈顶T减1 指令 OPR05 次栈顶的值除以栈顶的值 结果存入次栈顶T减1 类P code虚拟机 指令 OPR08 比较次栈顶与栈顶是否相等若相等 结果为0 存结果至次栈顶 T减1 指令 OPR09 比较次栈顶与栈顶是否不相等若不相等 结果为0 存结果至次栈顶 T减1 指令 OPR010 比较次栈顶是否小于栈顶若小于 结果为0 存结果至次栈顶 T减1 指令 OPR011 比较次栈顶是否大于等于栈顶若大于等于 结果为0 存结果至次栈顶 T减1 指令 OPR012 比较次栈顶是否大于栈顶若大于 结果为0 存结果至次栈顶 T减1 指令 OPR013 比较次栈顶是否小于等于栈顶若小于等于 结果为0 存结果至次栈顶 T减1 类P code虚拟机 指令 JMP0A 无条件转移至地址A 即置指令地址寄存器为A 指令 JPC0A 条件转移指令若栈顶为0 则转移至地址A 即置指令地址寄存器为A T减1 类P code虚拟机 指令 OPR014 栈顶的值输出至控制台屏幕T减1 指令 OPR015 控制台屏幕输出一个换行 指令 OPR016 从控制台读入一行输入 置入栈顶T加1 类P code虚拟机 类P code解释程序数据结构运行栈ints stacksize 指令寄存器structinstruction enumfctf 操作码 intl 引用层与声明层的层差 inta 因不同的f各异 i指令地址寄存器intp 基址寄存器intb 栈顶寄存器intt 虚拟机代码段structinstructioncode cxmax 类P code虚拟机 类P code解释程序处理流程 1 初始化p b t 0 s 0 s 1 s 2 0 2 取指令到指令寄存器i code p p 3 分析并解释执行指令i 4 若程序未结束 p 0 转 2 5 返回 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 b t p 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 5 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 5 0 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 1 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 0 0 16 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 0 0 16 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 0 0 16 5 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 0 0 16 5 10 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 0 0 16 15 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 0 0 16 15 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 15 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 15 2 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 15 2 15 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 15 30 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 15 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b t 0 0 0 5 15 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b 0 0 0 5 15 t 0 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b 0 0 0 0 15 t 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b 0 0 0 0 15 t 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b 0 0 0 0 15 0 t 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加 6 sto14栈顶值送变量c中 7 opr00退栈并返回调用点 16 8 int05主程序入口开辟5个栈空间 9 opr016从命令行读入值置于栈顶 10 sto03将栈顶值存入变量b中 11 lod03将变量b的值取至栈顶 12 lit00将常数值0进栈 13 opr09次栈顶与栈顶是否不等 14 jpc024相等时转 24 条件不满足转 15 cal02调用过程p 16 lit02常数值2进栈 17 lod04将变量c的值取至栈顶 18 opr04次栈顶与栈顶相乘 2 c 19 opr014栈顶值输出至屏幕 20 opr015换行 21 opr016从命令行读取值到栈顶 22 sto03栈顶值送变量b中 23 jmp011无条件转到循环入口 11 24 opr00结束退栈 类P code虚拟机 p b 0 0 0 0 15 0 0 t 例consta 10 varb c procedurep beginc b a end beginread b whileb 0dobegincallp write 2 c read b endend 0 jmp08转向主程序入口 1 jmp02转向过程p入口 2 int03过程p入口 为过程p开辟空间 3 lod13取变量b的值到栈顶 4 lit010取常数10到栈顶 5 opr02次栈顶与栈顶相加

温馨提示

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

评论

0/150

提交评论