PL/0指令集
PL/0指令集 |
(1)lit:将常数装入栈顶的指令;
(2)lod:将变量的值装入栈顶的指令;
case LOD : // 指令格式 (LOD, l, a)
stack [++top] = stack [base(stack,b,i.l)+i.a];
break ;
(3)sto:对应于赋值语句的存储指令;
case STO : // 指令格式 (STO, l, a)
stack[base (stack,b,i.l)+i.a] = stack[top];
printf("%d\n",stack[top]);
top --;
break ;
(4)cal:对应于过程调用的指令;
(5)int:增加栈顶寄存器的值,完成对局部变量的存储分配的指令;
(6)jmp,jpc:对应条件语句和循环语句的无条件转移和条件转移的控制转移指令;
(7)opr:包括一组算术和关系运算的指令。
指令域 |
一条指令由三个域组成:
(1)操作码 f:上面已经列出了所有 8 种操作码。
(2)层次差 l:这里的层次差就是 5.3.2 节介绍嵌套深度时的 n p − n a。该域仅用于存取指令和调用指令。
(3)多用途 a:在运算指令中,a 的值用来区分不同的运算;在其他情况,a 或是一个数(lit,int),或是一个程序地址(jmp,jpc,cal),或是一个数据地址(lod,sto)。
PL/0指令执行 |
编译器对 PL/0 源程序进行一遍扫描,并逐行输出源程序。在源程序无错的情况下,编译器每编译完一个分程序,就列出该分程序的代码,这由编译器的listcode 过程完成。每个分程序的第一条指令是 jmp 指令,其作用是绕过该分程序声明部分产生的代码(即绕过内嵌过程的代码)。listcode 过程没有列出这条代码。
解释器是编译器中的一个过程,若源程序无错,则编译结束时调用解释过程 interpret。由于 PL/0 语言没有输出语句,解释器按执行次序,每遇到对变量赋值时就输出该值。
由于 PL/0 语言是过程嵌套语言,因此程序运行时,活动记录栈中每个活动记录需要包含控制链和访问链,并按 5.3.2 节所讲的方法来建立访问链。
活动记录栈的栈顶以外的存储空间作为代码执行过程中所需要的计算栈,无需另外设立计算栈。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!