Vaje - Generiranje kode

Vaje - generiranje kode

Da bo zbirnik postal zaključena celota, mu je potrebno dodati še geneiranje kode. To lahko izvedemo na več načinov:

  • surova koda - kot je zapisana v pomnilniku SIC/XE stroja;
  • objektna koda - kot je zapisana v obj formatu.

Generiranje surove kode

Za generiranje surove kode bomo zopet uporabili princip obiskovanja.

a) V razredu Code bomo potrebovali obiskovalca. Napišite metodo:

  • byte[] emitCode()

ki vrne surovo kodo za celoten program. Takšno kodo je možno prepisati v pomnilnik stroja SIC/XE in jo neposredno izvajati.

b) V razredu Node moramo implementirati obisk vozlišča. Osnova generiranja surove kode bo metoda:

  • void emitCode(byte[] data, int pos)

ki na pozicijo pos v tabeli data zgenerira kodo, ki jo predstavlja vozlišče.

c) Metoda emitCode() je seveda virtualna in jo je potrebno v naslednikih ustrezno povoziti. Namigi:

  • generirati je potrebno length() bajtov;
  • (navadne) direktive ne generirajo nič;
  • vsak format je potrebno obravnavati posebej;
  • pomnilniške direktive naj generirajo ustrezne podake oz. ničle.

Generiranje objektne kode

a) V razredu Code napišite metodo:

  • String emitText()

ki vrne vsebino obj datoteke. Glavni program dopolnite, da za podano asm datoteko zapiše obj datoteko. Dodajte tudi H in E zapis. Pazite, da T zapisi niso predlogi (do 60 znakov).

b) V razredu Node in njegovih naslednikih napišite metodo:

  • void emitText(StringBuffer buf)

ki v buf doda objektni (hex) zapis surove kode vozlišča.. Namig: za večino ukazov te metode ni potrebno posebej pisati - raje naredite pretvorbo iz surove kode v hex zapis.

c) Za pomnilniške direktive pa je potrebno povoziti tudi emitText(...).

  • Direktivi BYTE in WORD generirata hex zapis podatkov.
  • Medtem ko RESB in RESW pa ne generirata nič.

Generiranje log datoteke

Generiranje surove in objektne kode je precej težko razhroščevati. Lažje bo, če si boste napisali še metodo za izpis simbolov in njihovih lokacij ter metodo za izpis surove kode z lokacijami in ostalimi podatki. Za primer glejte log datoteko simulatorja.

a) Napišite metoto:

  • String dumpSymbols()

ki vrne spisek vseh definiranih simbolov. Za primer glej Symbols del log datoteke.

b) Napišite metodo:

  • String dumpCode()

ki vrne generirano kodo po naslovih in pripadajoče ukaze. Za primer glej Code del log datoteke. Namigi:

  • izpis naslova je enostaven;
  • za izpis generirane kode uporabite emitCode();
  • izpis ukaza in operandov lahko naredite po že dani predlogi (glej Node.toString());
  • potrebno bo le povoziti metode operandToString(Node instruction) naslednikov razredna Mnemonic.

c) Dopolnite glavni program, da zapiše tudi log datoteko.

Last modified: Thursday, 27 December 2012, 12:15 PM