我正在使用指令集为PL0语言编写编译器。
我正在尝试编译以下代码:
var a;
procedure x;
begin
a:=a-1;
if a>0 then call x;
end;
begin
a:=2;
call x;
end.
说明代码应如下所示:
0 JMP 0 13
1 JMP 0 2
2 INT 0 3
3 LOD 1 3
4 LIT 0 1
5 OPR 0 3
6 STO 1 3
7 LOD 1 3
8 LIT 0 0
9 OPR 0 12
10 JMC 0 12
11 CAL 1 2
12 RET 0 0
13 INT 0 4
14 LIT 0 2
15 STO 0 3
16 CAL 0 2
17 RET 0 0
输入函数后,我们将静态链接,动态链接和返回地址的堆栈指针增加3。我真的不知道如何从递归调用访问全局变量“ a”,因为我不确定“ CALL 1,2”中的数字1的含义以及SL和DL记录的含义。我想其中之一是调用方的基本指针,而其中之一是被调用方的基本指针。