Harjoitukset
Tietokoneen toiminta, HT 3
19.3.2008 Kaikilla pitäisi nyt olla opintopiiri, jossa tekee ainakin projektin pr1. Lähettäkää minulle (Teemu.Kerola at cs.helsinki.fi) opintopiirin jäsenten nimet ja syntymäpäivistä laskemanne projektin pr1 aihepiirit. Opintopiirit ovat näkyvillä verkossa. Jos teillä ei vielä ole opintopiiriä ettekä halua tehdä töitä yksin, mailatkaa asiasta minulle. Mainitkaa samalla harjoitustilaisuutenne numeron - muodostaisin mieluummin opintopiirejä saman ryhmä jäsenistä.
- Kokonaisluvut. Oletetaan että desimaaliluku -13 on talletettu muistiin tavuosoitteeseen 0x1230. Mikä on tavujen 0x1230-0x1233 () sisältö, kun kyseinen luku on talletettu seuraavissa esitysmuodoissa:
- 32 bittinen Big-Endian etumerkillinen (sign and magnitude)
- 32 bittinen Big-Endian kahden komplementti (two's complement)
- 16 bittinen Big-Endian kahden komplementti (two's complement)
- 8 bittinen Big-Endian kahden komplementti (two's complement)
- 32 bittinen Big-Endian yhden komplementti (one's complement)
- 16 bittinen Big-Endian 32767 vakiolisäys (biased by 32767)
- 32 bittinen Little-Endian kahden komplementti (two's complement)
- 16 bittinen Little-Endian kahden komplementti (two's complement)
- 8 bittinen Little-Endian kahden komplementti (two's complement)
- Liukuluvut.
- Anna esimerkki realiluvusta, jonka voi täsmälleen esittää liukulukuna.
- Anna esimerkki realiluvusta, jota ei voi täsmälleen esittää liukulukuna. Kuinka suuri on virhe?
- Mikä on desimaalijärjestelmän luvun 4.25 IEEE liukulukustandardin mukainen esitys? Onko täsmällinen vai ei?
- Mitä desimaalijärjestelmän lukua binääriluku 101010.1010 vastaa?
- Mikä on desimaaliluvun 5.1 IEEE liukulukustandardin mukainen esitys? Onko täsmällinen vai ei?
- Laske lausekkeiden "(1.0666668-1.0666666) * 1.23456" ja "1.0666668*1.23456 - 1.0666666*1.23456" arvot jollakin ohjemointikielellä, joka tukee 32 bittisiä IEEE liukulukuja. Sijoita jokin tulostuskäsky ensimmäisen lausekkeen keskelle ennen kertolaskua (esim. test.c), jotta kääntäjä ei optimoi koodia liikaa. Miksi tulokset ovat erilaisia? Kumpi on oikein? Miksi 64-bittisten IEEE liukulukujen (C:n tai Javan tietotyyppi double) käyttäminen poistaa eroavaisuuden?
- Oletetaan, että ohjelmointikielessä MyLan on totuusarvo (boolean) ja liukuluku tietotyypit. Esimerkiksi, MyLan ohjelmissa voidaan käyttää boolean tai float tyyppisiä muuttujia.
- Ttk-91 koneessa ei kuitenkaan ole tällaisia tietotyyppejä. Voisiko MyLan kielelle tehdä kääntäjän, jonka avulla MyLan kielisiä ohjelmia voisi suorittaa ttk-91 koneessa? Jos voi, niin miten totuusarvo-operaatio AND ja liukulujen yhteenlasku toteutettaisiin? Jos ei voi, niin miksi ei?
- Miten ttk-91 koneen (laitteistotason) määrittelyä tulisi laajentaa, jotta sillä voisi käsitellä liukulukuja laitteistotasolla? Määrittele täsmällisesti kaikki muutokset.
- Muistiviitteet ja keskeytykset
- Montako muistiviitettä tarvitaan konekäskyn "STORE R1, @5(R2)" suorittamiseksi? Mitkä ne ovat?
- Montako muistiviitettä tarvitaan konekäskyn "ADD R4, R5" suorittamiseksi? Mitkä ne ovat?
- Miten keskeytykset on toteutettu suorittimessa? Mitä tapahtuu keskeytyksen käsittelyn jälkeen?
- Oletetaan, että tietyssä sovelluksessa tarvitaan sen omaa keskeytyskäsittelijää tietyn tyyppisten keskeytysten yhteydessä. Miten tämän voisi käytännössä toteuttaa konekäskytasolla eli miten valitaan annettu keskeytyskäsittelijä tietyn keskeytyksen yhteydessä tätä sovellusta ajettaessa ?
- Anna esimerkki tilanteesta, jossa olisi hyvä estää keskeytysten käsittely. Kuinka tämä käytännössä toteutetaan suorittimen tasolla? Mitä tapahtuu, jos keskeytykset ovat estettynä kauan aikaa?
- Joissakin suorittimissa on optio, jonka avulla voidaan määritellä, aiheutuuko liukukujen ylivuodosta keskeytys vai ei. Mitä hyötyä tällaisesta optiosta olisi ja miten sitä voisi hyödyntää?
- Tee tason B TitoTrainer tehtävät b-200, b-350 ja b-400.
Teemu Kerola