Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Like dokumenter
Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Dagens tema: Maskinkode. Litt datamaskinhistorie Hva er maskin- og assemblerkode? x86-prosessoren Programkode og variabler

2 Parser. 1 Skanner. 4 Kodegenerator. 3 Sjekker. Oversikt Datamaskinhistorie x86 Kodegenerering Setninger Uttrykk.

Oversikt Deklarasjoner Typesjekk Programmering Datamaskinhistorie x86 Kodegenerering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Dagens tema: Semantisk sjekking. Maskinkode. Hvordan finne deklarasjoner? Hvordan programmere sjekking av riktig navnebruk?

Oversikt Kompilering Syntaksanalyse Java Feilsjekking Oppsummering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Oversikt Deklarasjoner Typesjekk Datamaskinhistorie x86 Kodegenerering

Tema for siste forelesning:

Oversikt Oversettelse Logging Implementasjon Oppsummering

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Tema for siste forelesning:

Dagens tema: Formålet. Kodegenerering NB! Introduksjon Modulen Code. Enkle variable Noen enkle setninger Uttrykk

Dagens tema: Mer av det dere trenger til del 1

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet (kalt kildekoden): Hva er kompilering?

Dagens tema: Kodegenerering. Versjonskontroll. Variabler, spesielt vektorer Funksjoner, kall og parametre Noen siste gode råd.

Dagens tema: Sjekking

Hovedansvarlig. Symbolgenerator. Tregenerator. Litt mer kompliserte setninger med betingelser

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Tema for siste forelesning:

Oppbygningen av en datamaskin Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Tema for siste forelesning:

En oppsummering (og litt som står igjen)

Dagens tema: Resten av det dere trenger til del 1

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

Dagens tema Programmering av x86 Flytting av data Endring av størrelse

Dagens tema: Mer av det dere trenger til del 1

Dagens tema: Resten av det dere trenger til del 1

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

AlboC og kompilatoren hans. Kompendium for INF2100

INF2100. Oppgaver 23. og 24. september 2010

Dagens tema. Minnestrukturen Grovt sett ser minnet for hver process slik ut: Flytting av data. Programmering av x86

INF2100. Oppgaver uke 40 og

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

UNIVERSITETET I OSLO

Intro Rask kode x86-op Optimalisering Inline-kode Konklusjon

INF2100. Oppgaver 6. og 11. oktober 2011 C 100 X 10

Dagens tema. Raskere kode [REB&DRO H kap 5]

Å løse eksamensoppgaver

Dagens tema: 12 gode råd for en kompilatorskriver

Del 3: Evaluere uttrykk

Hvordan en prosessor arbeider, del 1

En oppsummering. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Eksamen. Programmeringsoppgaver Flervalgsoppgaver

Intro Evaluering Rask kode x86-op Optimalisering Inline-kode

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

INF april, 2015 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8. Ble lagt ut 24. april

INF2100. Oppgave 1. Oppgave 2 4. Løsningsforslag til oppgaver uke 40 og Se figur 1 på neste side.

Notater: INF2270 Assembler

Dagens tema: Sjekking (obligatorisk oppgave 3)

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Modifikasjon av grammatikken. Utifra dette RusC programmet:

Dagens tema INF1070. Bit fikling. Makroer. Blanding av C og assemblerkode. Mer om Core War. Dag Langmyhr,Ifi,UiO: Forelesning 22. mai 2006 Ark 1 av 25

INF april, 2014 Stein Krogdahl Ifi, UiO. Svar på oppgaver til kap. 8

Dagens tema. Programmering av x86 INF2270. Minnestrukturen i en prosess. Flytting av data Endring av størrelse. Aritmeriske operasjoner Flagg

Dagens tema INF1070. Makroer. Sanntidsprogrammering. Avbrudd. Bruker- og supermodus. Blanding av C og assemblerkode. Selvmodifiserende kode

Dagens tema: 12 gode råd for en kompilatorskriver. Prosjektet. Koblingen mellom grammatikken og klasser. Utifra dette RusC-programmet:

Løsningsforslag til eksamen i INF2270

Intro Digital eksamen Rask kode x86-op Optimalisering Inline-kode Konklusjon

Dagens tema. Raskere kode [REB&DRO H kap 5]

Dagens tema. Makroer Ofte gjentar man kodelinjer når man skriver assemblerkode. Da kan det lønne seg å definere en makro:

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

INF Noen oppgaver til kap. 8

INF Noen oppgaver til kap. 8

INF2100. Oppgave 1, 2 og 3. Løsningsforslag til oppgaver 23. og 24. september Her er det mange mulige løsninger her er én: import java.io.

Syntaksanalyse. Dagens tema: Språkdiagrammene Jernbanediagrammene er et ypperlig utgangspunkt for å analysere et program: INF2100 INF2100 INF2100

Dagens tema. Er maskinen big endian? Denne funksjonen tester det: INF1070 INF1070 INF1070 INF1070

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

IN2030. Oppgave 1. Løsningsforslag. Uke (Disse filene finnes også i mappen ~inf2100/e/e2/.)

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

Programmering av x86. Minnestrukturen i en prosess Flytting av data. Skifting og rotasjoner Hopp. Stakken Rutinekall. Aritmeriske regneoperasjoner

Dagens tema: INF2100. Syntaksanalyse. Hva annet gjør en kompilator? Sjekking av navnebruk. Testutskrifter

Velkommen til INF2100

C< og kompilatoren hans

UNIVERSITETET I OSLO

C og kompilatoren hans. Kompendium for INF2100

C< og kompilatoren hans

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Minneområder Det er vanlig å dele opp minnet til en prosess i disse ulike områdene: Fast minne Store og små indianere «align» ing struct er

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

UNIVERSITETET I OSLO

INF april, 2013 Kap. 8 Noen oppgaver som er meget relevante for Oblig 2

Hvordan skrive Flok og Flass kode? I mange tilfelle er det svært enkelt:

Løsningsforslag til eksamen i INF2270

En kompilator for Pascal. Kompendium for INF2100

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

Diverse eksamensgaver

Hjemmeeksamen 2 i INF3110/4110

Runtime-omgivelser Kap 7 - I

Forhistorien Menneskene har alltid prøvd å lage maskiner for å løse sine problemer. Dagens tema

Transkript:

Dagens tema Dagens tema: Kodegenerering Introduksjon Enkle variabler Uttrykk Tilordning Litt mer kompliserte setninger med betingelser (Alt om kodegenerering unntatt funksjoner.)

Prosjektoversikt Del 0 Del 1 Del 2 f.alboc alboc f.s types chargenerator scanner syntax code error log f.log

Det endelige målet Formålet Vårt oppdrag er å lage en kompilator: Inndata er trerepresentasjonen av AlboC-programmet laget i del 1. Utdata er en fil med x86 assemblerkode. AlboC-program x = x+1; Kompilator alboc Assemblerkode addl $1,%eax Assembler gcc Maskinkode 81 01 00 00...

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen Hvordan ser datamaskinen vår ut? Datamaskinen vår Minnet inneholder tre former for data: Data inneholder globale variabler. Stakken inneholder parametre og lokale variabler. Koden er programmet (som tall).

Hvordan ser datamaskinen vår ut? movl v 1, v 2 Flytt v 1 til v 2. cdq Omform 32-bits %EAX til 64-bits %EDX:%EAX. leal v 1, v 2 Flytt adressen til v 1 til v 2. pushl v Legg v på stakken. popl v Fjern toppen av stakken og legg verdien i v. negl v Skift fortegn på v. addl v 1, v 2 Adder v 1 til v 2. subl v 1, v 2 Subtraher v 1 fra v 2. imull v 1, v 2 Multipliser v 1 med v 2. idivl v Del %EDX:%EAX med v ; svar i %EAX. call lab Kall funksjonen i lab. enter $ n,$0 Opprett n byte lokale variabler. leave Fjern lokale variabler ret Returner fra funksjonen. cmpl v 1, v 2 Sammenligning v 1 og v 2. jmp lab Hopp til lab. sete v Sett v =1 om =, ellers v =0. setne v Sett v =1 om =, ellers v =0. setl v Sett v =1 om <, ellers v =0. setle v Sett v =1 om, ellers v =0. setg v Sett v =1 om >, ellers v =0. setge v Sett v =1 om, ellers v =0.

Et eksempel Anta at vi har AlboC-koden v = 1 + 2;. Disse x86-instruksjonene gjør dette: leal v,%eax # %EAX=&v %ECX=? %EDX=? stack=... pushl %eax # %EAX=&v %ECX=? %EDX=? stack=&v movl $1,%eax # %EAX=1 %ECX=? %EDX=? stack=&v pushl %eax # %EAX=1 %ECX=? %EDX=? stack=1 &v movl $2,%eax # %EAX=2 %ECX=? %EDX=? stack=1 &v movl %eax,%ecx # %EAX=2 %ECX=2 %EDX=? stack=1 &v popl %eax # %EAX=1 %ECX=2 %EDX=? stack=&v addl %ecx,%eax # %EAX=3 %ECX=2 %EDX=? stack=&v popl %edx # %EAX=3 %ECX=2 %EDX=&v stack=... movl %eax,(%edx) # v = 3 Husk! Mange kodebiter gjør det samme. I kompendiet står angitt nøyaktig hvilke som skal brukes.

Metoden gencode Hvordan implementere kodegenerering Det beste er å følge samme opplegg som for å sjekke programkoden: Kodegenerering Legg en metode gencode inn i alle klasser som representerer en del av AlboC-programmet (dvs er subklasse av SyntaxUnit).

Metoden gencode class WhileStatm extends Statement { Expression test; StatmList body; @Override void check(decllist curdecls) {. @Override void gencode(funcdecl curfunc) {. static WhileStatm parse() {. @Override void printtree() {.

Konvensjoner Konvensjoner Kodegenerering blir mye enklere om vi setter opp noen fornuftige konvensjoner: Alle beregninger skal ende opp i %EAX. %ECX og %EDX er hjelperegistre. Hovedstakken (aksessert via %ESP) er til mellomresultater funksjonskall (neste uke)

Hva slags variabler har vi? Variabler Det finnes fem sorter variabler i AlboC: Enkle Array-er Globale Lokale (De blå tar vi neste uke.) Parametre De kan være int eller pekere (dvs adresser). De kan forekomme i tre ulike situasjoner: Deklarasjon int v; Tilordning v = 1; Bruk if (v>0)...

Generering av globale variabler abstract class Declaration extends SyntaxUnit { String name, assemblername; DeclType typespec; Type type; boolean visible = false; Declaration nextdecl = null;. abstract class VarDecl extends Declaration { boolean isarray = false; int numelems = 0;.

Generering av globale variabler class GlobalVarDecl extends VarDecl { GlobalVarDecl(String n) { super(n); assemblername = (Alboc.underscoredGlobals()? "_" : "") + n; @Override void gencode(funcdecl curfunc) { if (isarray) { Code.genVar(assemblerName, true, numelems, type.size()/numelems, type+" "+name); else { Code.genVar(assemblerName, true, 1, type.size(), type+" "+name);.

Generering av globale variabler Metoden Code.genVar vil sette av plass til globale variabler: public static void genvar(string name, boolean global, int n, int nbytes, String comment) { if (! generatingdata) { codefile.println(".data"); generatingdata = true; if (global) codefile.println(".globl " + name); printlabel(name, false); codefile.printf(".fill %-24s", n+","+nbytes+",0"); if (comment.length() > 0) { codefile.print("# " + comment); codefile.println();

Tilordning Tilordning assign-statm assignment ; assignment lhs-variable = expression lhs-variable * variable

Tilordning I kompendiet finner vi kodeskjemaer for alle setningene. Assignment * n w = ie ; Beregn adressen til w med svar i %EAX movl (%eax),%eax gjentas n ganger pushl %eax Beregn ie med svar i %EAX popl %edx movl %eax,(%edx)

Tilordning Et forslag til implementering: class AssignStatm extends Statement { Assignment assignment; @Override void gencode(funcdecl curfunc) { assignment.gencode(curfunc);. class Assignment extends SyntaxUnit { LhsVariable lhs; /* "Left hand side" */ Expression rhs; /* "Right hand side" */ @Override void gencode(funcdecl curfunc) { lhs.gencode(curfunc); Code.genInstr("", "pushl", "%eax", ""); rhs.gencode(curfunc); Code.genInstr("", "popl", "%edx", ""); Code.genInstr("", "movl", "%eax,(%edx)", " =");.

Tilordning class LhsVariable extends SyntaxUnit { int numstars = 0; Variable var; Type type; @Override void gencode(funcdecl curfunc) { var.genaddresscode(curfunc); for (int i = 1; i <= numstars; ++i) Code.genInstr("", "movl", "(%eax),%eax", " *");

Tilordning Klassen Variable har både en gencode- og en genaddresscode-metode: void genaddresscode(funcdecl curfunc) { // Generate code to load the _address_ of the variable // rather than its value. if (index == null) { Code.genInstr("", "leal", declref.assemblername+",%eax", varname); else { index.gencode(curfunc); if (declref.type instanceof ArrayType) { Code.genInstr("", "leal", declref.assemblername+",%edx", varname+"[...]"); else { Code.genInstr("", "movl", declref.assemblername+",%edx", varname+"[...]"); Code.genInstr("", "leal", "(%edx,%eax,4),%eax", "");

Hvordan lagres uttrykk? Uttrykk expression Hvordan lager vi kode for et uttrykk som factor term term opr factor 4 * a - 17 primary factor opr primary primary? operand operand operand number variable number

Operander Operander Det er ganske enkelt å lage kode som legger en global enkel int-variabel i %EAX-registeret. v movl v,%eax Det er like enkelt for int-konstanter (tall eller tegn). n movl $ n,%eax ($-tegnet angir at det er snakk om en tallkonstant.)

Operatorer Aritmetisk operatorer ie 1 + ie 2 Beregn ie 1 med svar i %EAX pushl %eax Beregn ie 2 med svar i %EAX movl %eax,%ecx popl %eax addl %ecx,%eax Ved at alle int-operander er innom %EAX blir det enklere å skrive kodegenereringen. Divisjon og sammenligninger er litt vanskeligere; se tabellene i kompendiet. Hvorfor må ie 1 legges på stakken?

Kodegenering While-setningen while ( ie ) { S lab 1 : Beregn ie med svar i %EAX cmpl $0,%eax je lab 2 S jmp lab 1 lab 2 :

Navnelapper Lokale navnelapper Når vi skal lage slike hopp, trenger vi stadig nye navnelapper. Dette kan vi få fra Code-modulen: private static int numlabels = 0; public static String getlocallabel() { return String.format(".L%04d", ++numlabels);

Komplett kode Hele koden for WhileStatm class WhileStatm extends Statement { Expression test; StatmList body; @Override void gencode(funcdecl curfunc) { String testlabel = Code.getLocalLabel(), endlabel = Code.getLocalLabel(); Code.genInstr(testLabel, "", "", "Start while-statement"); test.gencode(curfunc); Code.genInstr("", "cmpl", "$0,%eax", ""); Code.genInstr("", "je", endlabel, ""); body.gencode(curfunc); Code.genInstr("", "jmp", testlabel, ""); Code.genInstr(endLabel, "", "", "End while-statement");

Et eksempel a = 1; while (a < 10) { a = a + 1; leal a,%eax # a pushl %eax movl $1,%eax # 1 popl %edx movl %eax,(%edx) # =.L0001: # Start while-statement movl a,%eax # a pushl %eax movl $10,%eax # 10 popl %ecx cmpl %eax,%ecx movl $0,%eax setl %al # Test < cmpl $0,%eax je.l0002 leal a,%eax # a pushl %eax movl a,%eax # a pushl %eax movl $1,%eax # 1 movl %eax,%ecx popl %eax addl %ecx,%eax # Compute + popl %edx movl %eax,(%edx) # = jmp.l0001.l0002: # End while-statement