Я пишу компилятор для языка 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» рекурсивного доступа к вызову, потому что я не совсем уверен, что означает число 1 в «CALL 1, 2» и для чего предназначены записи SL и DL.Я полагаю, один из них является базовым указателем вызывающего абонента, а один из них является базовым указателем вызываемого абонента.