Assembly-kielen Harjoitustehtävät¶
Tässä materiaalissa katsomme ensin miten y86-assembly-kääntäjää ja simulaattoria käytetään. Sitten esitämme miten harjoitustehtävien vastaukset tulee Lovelaceen palauttaa ja lopuksi itse harjoitustehtävät.
Simulaattori netissä¶
Netistä löytyy kätevästi y86-64-assembly-ohjelmointia varten simulaattorin verkkoversio.
Verkkoversio tarjoaa kurssille riittävän ympäristön assembly-ohjelmointiin, koskien sekä harjoitustehtävien että harjoitustyön suorittamista. Demo verkkoversion käytöstä löytyy Assembly-kielen luentokappaleesta. Hox! Muistakaa ottaa koodi talteen backuppeihin.
Myös muita y86-simulaattoriversioita löytyy verkosta, mutta ne saattavat olla esim. 32-bittiselle suoritinversiolle. Joten ne eivät suoraan käy kurssilla.
Simulaattori omalla tietokonella¶
Simulaattorin asennus unixeille¶
Virallista simulaattoria ei ole tarpeen asentaa kotikoneelle, eikä siitä ole erityistä hyötyä, mutta ohjelmiston voi halutessaan asentaa.
Simulaattorin (ja oppikirjan) kotisivu täällä. Mene vasemmalta menusta Student site -> Chapter 4: Processor Architecture).
Käännösprosessi Ubuntu:lle on seuraava.
- Esivalmistelut
- Tarvitaan flex-kirjasto, joka asentuu komennolla
sudo apt-get install flex
- Tarvitaan TCL/TK-kirjasto, joka asentuu komennolla
sudo apt-get install tk8.5-dev
- Simulaattorin Makefileen täytyy muuttaa kirjastojen nimet (tk ja tcl) muotoon tk8.5 ja tcl8.5, eli rivillä
TKLIBS=-L/usr/lib -ltk8.5 -ltcl8.5
- Joissain koneissa pitää myös asentaa bison-ohjelma, eli
sudo apt-get install bison
. - Valmisteluiden jälkeen simulaattorin manuaalista (kts. kotisivu) löytyy ohjeet simulaattorin kääntämiseen.
Assembly-ohjelman käännösprosessi¶
Assemblykääntäjää käytetään käskyllä
yas
.ubuntu:~$ ./yas ohjelma.ys
Kääntäjä tuottaa objektitiedoston
ohjelma.yo
, joka sitten annetaan simulaattorille. Objektitiedosto on myös tekstimuotoinen, joten sen sisälle kannattaa vilkaista! Sieltä näkyy mm. vastaava konekielen toteutus. Ohjelmien suoritus¶
Simulaattoripaketin mukana tulevat molemmat versiot: sekventiaalinen ja liukuhihnasuoritin. Molempien versioiden manuaali löytyy oppikirjan kotisivuilta täältä. Mutta liukuhihnasuoritinta ei kurssilla tarvita.
Sekventiaalisen simulaattorin käyttäminen tapahtuu seuraavasti
ssim
-käskyllä.ubuntu:~$ ssim ohjelma.yo
Jonka jälkeen simulaattori ajaa ohjelman komentotulkissa ja näyttää mitä jokaisessa käskyssä tehdään ja miten muistialueet sekä rekisterit muuttuivat.
Nyt simulaattorissa on oletuksena assembly-ohjelmille 10.000 suoritettavan käskyn raja. Tätä voi muuttaa komentoriviparametrillä
-l n
, jossa n on maksimikäskyjen määrä. Esimerkissä alla suoritetaan max. 50.000 käskyä. ubuntu:~$ ssim ohjelma.yo -l 50000
Tehtävät¶
Assembly-tehtävien koodit pitää palauttaa tietyssä muodossa, kuten alla kerrotaan. Tämä sen takia, että Lovelace pystyisi automaattisesti ne tarkistamaan eri syötteillä.
0. Kooditiedoston nimi päättyy päätteeseen
1. Palautettavan koodin ensimmäinen rivi pitää olla main-koodilohkon esittely:
.ys
1. Palautettavan koodin ensimmäinen rivi pitää olla main-koodilohkon esittely:
main:
...
- Tässä ei sijoiteta koodia muistiosoitteeseen
.pos
eikä tehdä muitakaan alustuksia. Tarvittavat alustukset voidaan tehdä main-lohkossa sisällä, mutta ei siis ennen sitä. main
-lohkon esittelyn jälkeen koodissa voi olla kaikki tarvittava: aliohjelmia, pinon alustuksia, jne. Mutta ei ennen sitä!- Omassa testikoodissa ennen palautusta voitte toki tehdä alustukset miten haluatte, mutta poistakaa ne palautettavasta koodista.
2. Tehtävässä annetaan syöte- ja tulos-rekisterit, joita on tehtävän koodissa käytettävä mainittuun tarkoitukseen. Muuten ei mene vastaus tarkistimesta läpi.
3. Jos tehtävässä on muita ohjeita, esim. maksimiarvo tai pinon alustus tiettyyn osoitteeseen, ne pitää olla kohdillaan.
4. Ohjelma päättyy aina
5. Muistakaa, että y86-kääntäjä olettaa että jokainen käsky päättyy aina rivinvaihtoon! (ts. koodin loppuun ylimääräinen rivi). Muutoin koodi ei mene tarkistimesta läpi.
3. Jos tehtävässä on muita ohjeita, esim. maksimiarvo tai pinon alustus tiettyyn osoitteeseen, ne pitää olla kohdillaan.
4. Ohjelma päättyy aina
halt
-käskyyn.5. Muistakaa, että y86-kääntäjä olettaa että jokainen käsky päättyy aina rivinvaihtoon! (ts. koodin loppuun ylimääräinen rivi). Muutoin koodi ei mene tarkistimesta läpi.
- Simulaattorin
yas
-kääntäjä valittaa kyllä virheestä, mutta se ei näy Lovelacessa.
Esimerkki. Oletetaan tehtävä: Laske yhteen rekisterien %rax ja %rbx arvot ja palauta tulos %rbx-rekisterissä. Tällöin testikoodi voi olla seuraavanlainen:
.pos 0
irmovq $2,%rax
irmovq $3,%rbx
main:
addq %rax,%rbx
halt
Tehtävän vastauksena palautetaan kuitenkin vain koodit main-lohkosta alkaen, eli:
main:
addq %rax,%rbx
halt
Tällöin Lovelace voi testata vastauskoodia alustamalla rekistereihin omat testisyötteet.
Tärkeää!! y86-simulaattori (Lovelacessa) pystyy käsittelemään vain alle 10000 konekielen käskyä, huomatkaa tämä koodatessa. Tehtävät on laadittu siten, ettei niitä suorittaessa menisi montaa tuhatta käskyä.
Ok, aloitetaan..
Anna palautetta
Kommentteja harjoituksista?