y86 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.
Työasemaluokat¶
Työasemaluokkiin on asennettu valmiiksi virtuaalikone TKJ_harjoitukset, jossa on sekä tarvittava kääntäjä ja simulaattori valmiiksi asennettuna. Virtuaalikoneen käyttöohjeet löytyvät materiaalista Kootut Ohjeet.
Asentaminen kotikoneelle¶
Simulaattorin voi myös ladata ja asentaa omalle koneelle täältä (Vasemmalta menusta Student site ja Chapter 4: Processor Architecture).
Emme suosittele simulaattorin jatai kääntäjän asentamista muille ympäristöille kuin linux. Esim. Ubuntu:lla toimii hyvin.
- Simulaattorin ajamiseen omalla Windows/MAC kannattaa luoda oma virtuaalikone.
- Tarvitaan VMWare Workstation Player. Asentakaa ilmainen versio opetuskäyttöön.
- Ubuntu-virtuaalikone asennetaan 'Ubuntu iso image:na, versio 16.04 LTS. Joka löytyy Ubuntun virallisilta sivuilta.
- Asennus
- 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
. - Tämän jälkeen manuaalista löytyy ohjeet simulaattorin kääntämiseen Ubuntu-virtuaalikoneessa
Ohjelmien ajaminen¶
Kääntäjä toimii 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. Simulaattoreiden manuaali löytyy täältä.
Sekventiaalisen simulaattorin käyttäminen tapahtuu seuraavasti
ssim__
-käskyllä. ssim
-käskyllä aukeaa graafinen käyttöliittymä.ubuntu:~$ ./ssim__ ohjelma.yo ubuntu:~$ ./ssim ohjelma.yo
Jonka jälkeen simulaattori ajaa ohjelman ruudulla / käyttöliittymässä ja näyttää mitä jokaisessa käskyssä tehdään jamiten muistialueet sekä rekisterit muuttuivat.
Tarjolla on myös liukuhihna-version simulaattori, jolle on myös vastaavasti graafinen käyttöliittymä:
ubuntu:~$ ./psim ohjelma.yo ubuntu:~$ ./psim -g ohjelma.yo
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ä.
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?