目标代码类 pcode 目标代码类 pcode是一种假想栈式计算机的汇编语言。 指令格式: f f1a 功能码 层次差(标识符引用层减去定义层) 根据不同的指令有所区别
目标代码类pcode 目标代码类pcode是一种假想栈式计算机的汇编语言。 指令格式: f l a f 功能码 l 层次差 (标识符引用层减去定义层) a 根据不同的指令有所区别
LT0a将常数值取到栈顶,a为常数值 LDIa将变量值取到栈顶,a为偏移量,1为层差 ST01a将栈顶内容送入某变量单元中,a为偏移量,1为层差 CAL1a调用过程,a为过程地址,1为层差 INT0a在运行栈中为被调用的过程开辟a个单元的数据区 JP0a无条件跳转至a地址 JPC0a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺 序执行 oP00过程调用结柬后,返回调用点并退栈 0PR01栈顶元素取反 0PR02次栈顶与栈顶相加,退两个栈元素,结果值进栈 指令功能表 0PR03次栈顶减去栈顶,退两个栈元素,结果值进栈 0PR04次栈顶乘以栈顶,退两个栈元素,结果值进栈 0PR05次栈顶除以栈顶,退两个栈元素,结果值进栈 0PR06栈顶元素的奇偶判断,结果值在栈顶 OPR 0 7 0PR08次栈顶与栈项是否相等,退两个栈元素,结果值进栈 0PR09次栈顶与栈项是否不等,退两个栈元素,结果值进栈 0PR010次栈顶是否小于栈顶,退两个栈元素,结果值进栈 0PR011次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈 PR012次栈顶是否大于栈顶,退两个栈元素,结果值进栈 0P013次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈 oPR014栈项值输出至屏幕 0PR015屏幕输出换行 0PR016从命令行读入一个输入置于栈顶
LIT 0 a 将常数值取到栈顶,a为常数值 LOD l a 将变量值取到栈顶,a为偏移量,l为层差 STO l a 将栈顶内容送入某变量单元中,a为偏移量,l为层差 CAL l a 调用过程,a为过程地址,l为层差 INT 0 a 在运行栈中为被调用的过程开辟a个单元的数据区 JMP 0 a 无条件跳转至a地址 JPC 0 a 条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺 序执行 OPR 0 0 过程调用结束后,返回调用点并退栈 OPR 0 1 栈顶元素取反 OPR 0 2 次栈顶与栈顶相加,退两个栈元素,结果值进栈 OPR 0 3 次栈顶减去栈顶,退两个栈元素,结果值进栈 OPR 0 4 次栈顶乘以栈顶,退两个栈元素,结果值进栈 OPR 0 5 次栈顶除以栈顶,退两个栈元素,结果值进栈 OPR 0 6 栈顶元素的奇偶判断,结果值在栈顶 OPR 0 7 OPR 0 8 次栈顶与栈顶是否相等,退两个栈元素,结果值进栈 OPR 0 9 次栈顶与栈顶是否不等,退两个栈元素,结果值进栈 OPR 0 10 次栈顶是否小于栈顶,退两个栈元素,结果值进栈 OPR 0 11 次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈 OPR 0 12 次栈顶是否大于栈顶,退两个栈元素,结果值进栈 OPR 0 13 次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈 OPR 0 14 栈顶值输出至屏幕 OPR 0 15 屏幕输出换行 OPR 0 16 从命令行读入一个输入置于栈顶 指令功能表
0)jmp08转向主程序入口 1)jmp02转向过程p入口 const a=10 2)int03过程p入口,为过程p开辟空间 3)10d13取变量b的值到栈顶 var b,C, (4)1it010取常数10到栈顶 procedure p (5)opr02次栈顶与栈顶相加 begin (6)sto14栈顶值送变量c中 (7)opr00退栈并返回调用点(16) c:=bta. (8)int05主程序入口开辟5个栈空间 end 9)opr016从命令行读入值置于栈顶 (10)sto03将栈顶值存入变量b中 begin (11)1od03将变量b的值取至栈顶 read (b) (12)1it00将常数值0进栈 (13)opr09次栈顶与栈顶是否不等 while beto do (14)jpc024等时转(24)(条件不满足转) egin (15)ca102调用过程p (16)1it02常数值2进栈 call p (17)1od04将变量c的值取至栈顶 write(2*c);‖(18)r04次栈顶与栈顶相乘(2*c) read (b) (19)opr014栈顶值输出至屏幕 end (20)opr015换行 (21)opr016从命令行读取值到栈顶 end (22)sto03栈顶值送变量b中 (23)jmp011无条件转到循环入口(11) 424)opr00结束退栈
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); end end. ( 0) jmp 0 8 转向主程序入口 ( 1) jmp 0 2 转向过程p入口 ( 2) int 0 3 过程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的值取至栈顶 (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) sto 0 3 栈顶值送变量b中 (23) jmp 0 11 无条件转到循环入口(11) (24) opr 0 0 结束退栈
PL/0编译程序的结构 PL/0源程序 词法分析程 语法语义分析程序 代码生成程序 目标程序
PL/0编译程序的结构 词法分析程 序 语法语义分析程序 代码生成程序 表格管理程序 出错处理程序 PL/0源程序 目标程序
PL/0编译程序的总体设计 其编译过程采用一趟扫描方式 以语法、语义分析程序为核心 词法分析程序和代码生成程序都作为一个过程,当语法 分析需要读单词时就调用词法分析程序,而当语法、语 义分析正确,需要生成相应的目标代码时,则调用代码 生成程序。 表格管理程序实现变量,常量和过程标识符的信息的登 录与查找。 出错处理程序,对词法和语法、语义分析遇到的错误给 出在源程序中出错的位置和与错误性质有关的编号,并 进行错误恢复
PL/0编译程序的总体设计 其编译过程采用一趟扫描方式 以语法、语义分析程序为核心 词法分析程序和代码生成程序都作为一个过程,当语法 分析需要读单词时就调用词法分析程序,而当语法、语 义分析正确,需要生成相应的目标代码时,则调用代码 生成程序。 表格管理程序实现变量,常量和过程标识符的信息的登 录与查找。 出错处理程序,对词法和语法、语义分析遇到的错误给 出在源程序中出错的位置和与错误 性质有关的编号,并 进行错误恢复