Laboratorium 10: kod czwórkowy

Kod czwórkowy

W PUBLIC/MRJP/Quadruples/ dostępny jest edukacyjny interpreter kodu czwórkowego iquadr}

Implementowany dialekt:

  • program jest ciągiem otypowanych funkcji
  • nieograniczona ilość rejestrów typu int i double, np. i0, d1
  • zmienne lokalne i tymczasowe: t2 := a + t1 pisane jako $.i2 := a.i3 + $.i1 (identyfikator przed kropką ma charakter li tylko komentarza)
  • brak zmiennych globalnych (tylko funkcje)
  • konwersje między typami np. $.i1 := b.d0
  • dodatkowa instrukcja print, np. print $.i0
  • nie ma wbudowanego mechanizmu przekazywania parametrów
  • dostęp do pamięci; adresowanie postaci {rejestr+stała}, np. {sp.i1-1} := 2,
    a.i3 := {bp.i2+1}

Przykłady

Liczby Fibonacciego

function main : int :
    $.d3 	:= 1.0
    lo.i0 	:= $.d3
    hi.i1 	:= lo.i0
    mx.i3 	:= 5000000
    mx.i2 	:= $.i3
    print lo.i0
L0:
    if hi.i1 >= mx.i2 goto L1
    print hi.i1
    $.i3 	:= lo.i0 + hi.i1
    hi.i1 	:= $.i3
    $.i3 	:= hi.i1 - lo.i0
    lo.i0 	:= $.i3
    goto L0
L1:
function end

Wywołanie funkcji z przekazywaniem argumentów w rejestrach:

function main : int :
  $.i0 := -40
  $.i0 := ~$.i0
  $.d0 := 3.14159
  call add
  print $.i0
function end
 
function add : int -> double -> int :
  $.i1 := b.d0
  result.i0 := a.i0 + $.i1
function end

Protokół wywołania funkcji przy użyciu stosu:

function main : int :
  sp.i1 := 512 
  bp.i2 := sp.i1
  {sp.i1-1} := 2
  {sp.i1-2} := 3
  sp.i1 := sp.i1 - 2
  call add
  print retval.i0
function end
 
function add : int -> int -> int :
  sp.i1 := sp.i1 - 1
  {sp.i1+0} := bp.i2
  bp.i2 := sp.i1
  a.i3 := {bp.i2+1}
  b.i4 := {bp.i2+2}
  retval.i0 := a.i3 + b.i4
function end

Zadania

1. Zakoduj i przetestuj prostą funkcję, np. silnię
2. Rozszerz kalkulator z poprzednich zajęć o funkcję generowania kodu czwórkowego
3. Dodaj instrukcje warunkowe, pętli,...