Выдача листинга
Oct. 13th, 2021 05:13 pmВнёс мелкие исправления и добавил выдачу листинга помимо трассировки. Дальше буду смотреть в сторону принципов изложенных в книге дракона по компиляторам.
Для примера:
Листинг выглядит так:
Результат работы:
Для примера:
module towers;
var
n : integer;
procedure write2ln(x, y: integer);
begin
writeint(x);
writespace(1);
writeint(y);
writeln
end write2ln;
procedure hanoy(n, x, y, z: integer);
begin
if n > 0 then
hanoy(n-1, x, z, y);
write2ln(x, y);
hanoy(n-1, z, y, x)
end
end hanoy;
begin
n := 3;
hanoy(n, 1, 2, 3)
end towers.
Листинг выглядит так:
TEXT:
00000: write2ln VLOAD -2
00001: SYSCALL writeint
00002: DEALLOC 1
00003: CONST 1
00004: SYSCALL writespace
00005: DEALLOC 1
00006: VLOAD -1
00007: SYSCALL writeint
00008: DEALLOC 1
00009: SYSCALL writeln
00010: RETURN
00011: hanoy VLOAD -4
00012: CONST 0
00013: RELOP >
00014: BR_ZERO L0
00015: VLOAD -4
00016: CONST 1
00017: BINOP -
00018: VLOAD -3
00019: VLOAD -1
00020: VLOAD -2
00021: CALL 11
00022: DEALLOC 4
00023: VLOAD -3
00024: VLOAD -2
00025: CALL 0
00026: DEALLOC 2
00027: VLOAD -4
00028: CONST 1
00029: BINOP -
00030: VLOAD -1
00031: VLOAD -2
00032: VLOAD -3
00033: CALL 11
00034: DEALLOC 4
00035: L0
00036: RETURN
00037: towers_main ALLOC 1
00038: CONST 3
00039: VSTOR -1
00040: VLOAD -1
00041: CONST 1
00042: CONST 2
00043: CONST 3
00044: CALL 11
00045: DEALLOC 4
00046: STOP 12345
CONSTANT TABLE:
PROCEDURE TABLE
write2ln: 0
hanoy: 11
towers_main: 37
Результат работы:
1 2 1 3 2 3 1 2 3 1 3 2 1 2 STOP at 46, CYCLES=316, max stack size: 27