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
    1. muistista (muistipaikasta)
    2. rekisteristä
    3. 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
    1. Tulostaa R1:n osoittaman henkilön kaikkien kenttien arvot, kun R1 on ensin alustettu osoittamaan Jussin tietoja konekäskyllä "LOAD   R1, =Jussi".
    2. Asettaa Maijan id:ksi 6666, iäksi 32, ja palkaksi saman kuin mitä Jussilla tällä hetkellä on.
    3. Tulostaa Pekan, Jussin ja Maijan palkkojen summan.
    4. Tulostaa näistä kolmesta tällä hetkellä nuorimman henkilön iän.

  3. Tee ttk-91 koneen symbolisella konekielellä ohjelma, joka
    1. Varaa tilaa 20-alkioiselle taulukolle Tbl[20]
    2. Alustaa suoritusaikana taulukon Tbl siten, että Tbl[i] = i*i
    3. 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)".
    4. Tulostaa lasketun summan

  4. Tee ttk-91 koneen symbolisella konekielellä ohjelma, joka
    1. Varaa tilaa 20-alkioiselle taulukolle Tbl[20]
    2. Alustaa suoritusaikana taulukon Tbl siten, että Tbl[i] = i*i
    3. Alustaa osoitinmuuttujan Xptr osoittamaan taulukon Tbl ensimmäiseen alkioon
    4. Tulostaa osoitinmuuttujan Xptr arvon
    5. 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".
    6. 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ä.