Tietokoneen toiminta, kevät 2005 Harjoitus 3 Käsitellään harjoitusryhmissä maanantaina 30.5.2005 . Varaudu harjoituksiin etukäteen tutustumalla käsiteltävään asiaan ja yrittämällä itse tehdä tehtäviä niin paljon kuin mahdollista. Linkki harjoitustehtäviin on: http://www.cs.helsinki.fi/u/marttine/tito/avoink05/harjoitukset/. Harjoitustilaisuudessa tehtävät käsitellään ryhmissä. Mikäli mahdollista, niin tarkista ohjelmasi toimivuus kääntämällä ja suorittamalla se Titokoneen avulla. 1.Ohjelmassa käytetyt vakiot (esim. luku MAXID=78) voivat sijaita useassa eri paikassa ohjelman suorituksen aikana. Anna ttk-91-koneen symbolisella konekieliset käskyt, joilla rekisterin R1 arvoon lisätään vakion MAXID arvo ja vakion MAXID arvo (78) otetaan käyttöön a.muistista (muistipaikasta) b.rekisteristä c.konekäskystä Anna esimerkki tilanteesta, jossa tapa (a) olisi sopivin. Vastaavasti tapauksille b ja c. Perustele esimerkkisi. 2.Henkilörekisterin tietuetyyppi on määritelty pseudokäskyillä   # record person: 3 integer fields Id EQU 0 # relative address within record Age EQU 1 Salary EQU 2 Tietueet Pekka ja Jussi on varattu muistista alustettuna ja tietue Maija on varattu muistista alustamattonana pseudokäskyillä Pekka DC 3214 # ID = 3214 DC 35 # AGE = 35 DC 12345 # SALARY = 12345 Jussi DC 8888 DC 54 DC 14321 Maija DS 3 # initial values not defined Esimerkki: Jos R4 osoittaa tietueen Pekka alkuun, niin Pekan palkka saadaan rekisteriin R5 konekäskyllä "LOAD   R5, Salary(R4)". Tee ttk-91-koneen symbolisella konekielellä ohjelma, joka a.Tulostaa R1:n osoittaman henkilön kaikkien kenttien arvot, kun R1 on ensin alustettu osoittamaan Jussin tietoja konekäskyllä "LOAD   R1, =Jussi". b.Asettaa Maijan id:ksi 6666, iäksi 32, ja palkaksi saman kuin mitä Jussilla tällä hetkellä on. c.Tulostaa Pekan, Jussin ja Maijan palkkojen summan. d.Tulostaa näistä kolmesta tällä hetkellä nuorimman henkilön iän. 3.Tee ttk-91 koneen symbolisella konekielellä ohjelma, joka a.Varaa tilaa 20-alkioiselle taulukolle Tbl[20] b.Alustaa suoritusaikana taulukon Tbl siten, että Tbl[i] = i*i c.Laskee taulukon Tbl alkioiden summan siten, että indeksirekisterissä R1 on aina käsiteltävän taulukon alkion indeksi. Uusi alkio ladattaisiin siis R3:een konekäskyllä "LOAD R3, Tbl(R1)". d.Tulostaa lasketun summan 4.Tee ttk-91 koneen symbolisella konekielellä ohjelma, joka a.Varaa tilaa 20-alkioiselle taulukolle Tbl[20] b.Alustaa suoritusaikana taulukon Tbl siten, että Tbl[i] = i*i c.Alustaa osoitinmuuttujan Xptr osoittamaan taulukon Tbl ensimmäiseen alkioon d.Tulostaa osoitinmuuttujan Xptr arvon e.Laskee taulukon Tbl alkioiden summan siten, että osoitinrekisterissä R2 on aina käsiteltävän taulukon alkion osoite (pointteri). Uusi alkio ladattaisiin siis konekäskyllä "LOAD  R3, @R2". f.Tulostaa lasketun summan 5.Laadi TTK-91:n symbolisella konekielellä aliohjelma Vaihda, joka vaihtaa parametriensa X ja Y arvon: APU = X; X = Y; Y = APU; Tee myös pääohjelma, joka kutsuu aliohjelmaa vaihda vaihtamaan taulukon T kahden ensimmäisen alkion arvot keskenään. Välitä parametrit aktivointitietueessa. Piirrä myös kuva aktivointitietuepinosta. 6.Tee ttk-91-koneen symbolisella konekielellä n:nnen Fibonacci-luvun laskeva ohjelma, joka voisi olla käännös C-ohjelmasta int n, i, prev, fib, next; /* variables n, i, prev, fib, next */ main () { /* main program */ scanf ("%d", &n); /* read n */ i = 1; prev = 0; fib = 1; while (i < n) { next = prev+fib; prev = fib; fib = next; i = i+1; } printf ( "%d %d \n", n, fib); /* print n, fib */ } Voit pitää muuttujien arvoja joko muistissa tai rekistereissä.