PL0 рекурсивный вызов, как получить доступ к глобальной переменной - PullRequest
0 голосов
/ 29 декабря 2018

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

...