Introduksjon til DARK assembly Magnus Jahre Institutt for datateknikk og informasjonsvitenskap
2 Plan Assembly vs. Java Dark stakkmaskin Oversikt over stakkmaskinen Dark stakkmaskin eksempel Dark Load-Store maskin Oversikt over Load-Store maskinen Aritmetikk Minnet Kontrollflyt Noen tips
3 Assembly vs. Java En linje i Java kan tilsvare flere titalls linjer i assembly Assembly krever kunnskap om den underliggende maskinen Assembly kjører bare på en gitt maskin, mens Java kan kjøre på en hvilken som helst maskin Assembly tilsvarer lavnivå instruksjoner
4 Dark stakkmaskin Alle instruksjoner manipulerer en stakk. Denne stakken fungerer på samme måte som dere kjenner fra alg.dat. og programmering. Alle operasjoner foregår på toppen av stakken. Aritmetikk foregår ved å ta vekk to øverste elementene på stakken og legge igjen resultatet. To elementer blir altså ett.
5 Aritmetikk Vanlige aritmetiske/logiske operasjoner: add sub div mul Eksempel: push 3 push 5 add ; 3 legges paa stakken ; 5 legges paa stakken ; De to over fjernes og summen pushes
6 Stakkmanipulasjon dup - Kopierer det øverste elementet og legger det på toppen. swap - Bytter om rekkefølgen av de to øverste elementene. drop - Det øverste elementet tas vekk. rot - De tre øverste verdiene roteres slik at verdien som før lå øverst, nå ligger nederst.
7 Hvordan utføre hopp? For å utføre ett hopp må man gjøre ting i to steg. Først må man gjøre en test, og så kan man hoppe etter hva slags resultat man fikk. De to øverste elementene testes. Er uttrykket sant legges 1 på stakken, 0 hvis ikke. eq - EQual ge - Greater or Equal gt - Greater Than le - Less or Equal lt - Less Than ne - Not Equal Rekkefølge: resultat nest overst stakktopp
8 Hvordan utføre hopp? - II Selve hoppet baserer seg så på testen: jfalse - Hopp hvis det ligger 0 på stakken jtrue - Hopp hvis det ligger 1 på stakken jmp - Hopp uansett Parrene eq / jtrue og ne / jfalse ekvivalente!
9 Dark stakkmaskin eksempel Vi løser Dark Min oppgaven (272) i AoC
10 Dark Load-Store arkitektur I en load-store maskin har man følgende ressurser tilgjengelig: 32 registre ($0 til og med $31), men: register 0 ($0) er alltid lik null register 1 ($1) er reservert for assembleren register 31 ($31) brukes til stakken Ett stort minne
11 Aritmetikk I - Add Syntaks add REGISTER,REGISTER,{REGISTER NUMMER} Semantikk register register + {register NUMMER} Målregisteret får summen av andre og siste verdi. ; Kodeeksempel load $2, 10 ; Last verdien 10 inn i $2 add $3, $2, 10 ; Summen av $2 og 10 legges i $3 add $4, $2, $3 ; Summen av $2 og $3 legges i $4 Hvilken verdi er nå lagret i register 4?
12 Aritmetikk II - Sub Syntaks: sub REGISTER,REGISTER,{REGISTER NUMMER} Semantikk: register register {register NUMMER} Målregisteret får differansen av det andre registeret og den siste verdien. Eksempel: sub $1, $2, $3 ; $1 = $2 - $3
13 Og så videre... Multiplikasjon, Divisjon, logiske operatorer(and, OR, SHIFT, etc.) er akkurat tilsvarende Les dokumentasjonen (AoC og It s learning) Spesielt interessante instruksjoner: inc - Inkrementerer et register med en dec - Dekrementerer et register med en Nyttig i løkker
14 Et lite eksempel OPPGAVE: r8 = (r1 * r2) + (r3 * r4) Java DARK int temp1 = r1 * r2; int temp2 = r3 * r4; r8 = temp1 + temp2; mul $5, $1, $2 mul $6, $3, $4 add $8, $5, $6
15 Minnet I - Load Syntaks: load REGISTER,{REGISTER+NUMMER NUMMER VARIABEL} Semantikk: register {mem[register+num] NUM VAR} Målregisteret får enten verdien som er angitt som et tall, innholdet i variabelen eller innholdet i minneposisjonen som man finner ut fra registeret + nummeret. Eksempel: load $4, $3+0 ; Legger innholdet i minneadresse $3 inn i register $4.
16 Minnet II - Store Syntaks: store REGISTER,{REGISTER+NUMMER VARIABEL} Semantikk: {mem[register+nummer] VARIABEL} register Registeret lagres i variabelen eller i minneposisjonen som pekes ut av registeret + nummeret. Eksempel: store $2, $3+0 ; Legger register $2 inn i minneposisjon $3. MERK: De 32 registerene i load-store maskinen er mer enn nok lagerplass i alle oppgavene i DMGK.
17 Kontrollflyt I - JMP Programmet hopper til en gitt etikett i koden. Eksempel: toppen: inc $7 jmp toppen
18 Kontrollflyt II - Betingede hopp Det finnes mange situasjoner der man bare vil hoppe i gitte situasjoner, da benytter man betingede hopp. Disse er: jeq - Jump if EQual jne - Jump if Not Equal jge - Jump if Greater or Equal jgt - Jump if Greater jle - Jump if Less or Equal jlt - Jump if Less load $3, 5 start: inc $2 jeq $2, $3, stopp jmp start stopp:
19 IF-setninger I Java og liknende språk har vi ofte behov for kunne uttrykke betingelser i form av if-setninger. Ett eksempel: Java DARK if (a>b) { a = a + b; } else { a = a - b; } etikett2: slutt: ; Merk: a=$2, b=$3 jgt $2, $3, etikett2 add $2, $2, $3 jmp slutt sub $2, $2, $3
20 WHILE-løkker Java int a = 0; while(a <= 10) { // Noe nyttig a = a + 1; } DARK ; Merk: a=$5,$6=10 add $5, $0, $0 load $6, 10 toppen: jge $5, $6, slutt ; Noe nyttig inc $5 jmp toppen slutt:...
21 FOR-løkker Java int j = 5; for(int i = 0; i <= j; i++){ // noe nyttig } DARK test: ferdig: load $5, 0 ; i=0 load $6, 5 ; j=5 jge $5, $6, ferdig ; noe nyttig inc $5 jmp test Legg merke til at assemblykoden for for-løkken er identisk med den til while-løkken på forrige foil.
22 Noen tips Husk å fjerne testdata før du validerer! Når du har fått til en darkoppgave, finner du koden din og løsningsforslag i oppgaveboken. Bruk kommentarer flittig! Begynn med et lite problem eller en del av problemet. Da slipper du å tenke på alt med en gang. Tegn stakken på et papir og finn ut hva du må gjøre før du skriver kode. Gjør det enkelt!