Tietokoneen toiminta kevät 2005

Laskuharjoitus 4 (perjantaina 26.8.2005.)

  1. Vastaa seuraaviin kysymyksiin:
    1. Mihin ympäristöosoitinta FP käytetään? Miksi sitä tarvitaan?
    2. Miten pinoa käytetään aliohjelmien yhteydessä? Millä muulla tavalla parametrit voisi välittää?
    3. Mitä toimintoja on suoritettava aliohjelmaan siirryttäessä?
    4. Mitkä näistä toiminnoista suoritetaan CALL- ja EXIT-käskyjen yhteydessä?
    5. Mitä eroavat toisistaan arvo- ja viiteparametri?
    6. Voisiko esimerkkitietokoneessa TTK-91 aliohjelmien kutsurakenteen aktivointitietueiden käsittelyineen toteuttaa ilman käskyjä CALL ja EXIT? Miten tämä onnistuisi (mikäli se siis olisi mahdollista)?

  2. Käännä seuraava rekursiivinen aliohjelma konekielelle:
             static long Duo(int n) {
                if n < 1 then return 1 else
                return Duo(n-1)+n+1;
             }
    
    Kirjoita myös yksinkertainen pääohjelma, jossa kutsutaan metodia Duo.

  3. Tee TTK-91:n symbolisella konekielellä aliohjelma Kopioi, joka kopioi muistialueelta Lahde muistialueelle Kohde n:n muistipaikan sisällön. Välitä parametrit Lahde, Kohde ja n pinossa. Laadi lisäksi pääohjelma, joka kopioi sadan muistipaikan sisällön muistialueelta Vanha alueelle Uusi.

  4. Vastaa seuraaviin kysymyksiin:
    1. Käskyjen suoritus koostuu useasta vaiheesta. Mitä vaiheet ovat? Missä määrin eri vaiheita voitaisiin suorittaa samanaikaisesti /limittäin?
    2. Mitkä tilanteet aiheuttavat keskeytyksen? Miten keskeytys havaitaan ja mitä sitten tapahtuu?
    3. Esitä prosessorin rekisterien tasolla miten suoritetaan seuraavat käskyt:
         i)   MUL R2,@5 
         ii)  DIV R2,@R5 
         iii) SUB R5,5(R5) 
         iv)  JPOS R5, 100 
      

  5. Alla on annettu Fibonaccin luvut laskeva ohjelma (pääohjelma ja rekursiivinen aliohjelma; F0 = 1, F1 = 1, Fn = F(n-1)+F(n-2). Toimiiko ohjelma? Jos ei, niin korjaa se. Jos toimii, simuloi sitä. Kuinka monta kertaa funktiota F itse asiassa kutsutaan, jos m=3?
                     m   DS 1
    
               1: LaskeF IN    R1, =KBD            
                                                   
               2:        STORE R1, m               
               3:        PUSH  SP, =0              
               4:        PUSH  SP, R1              
               5:        CALL  SP, F              
               6:        POP   SP, R2              
               7:        OUT   R2, =CRT            
                                                   
                     N   EQU   -2                  
                   F_RET EQU   -3                  
                                                   
               8: F      LOAD  R1, N(FP)          
               9:        JNZER R1, *+4             
              10:        ADD   R1, =1                 
              11:        STORE R1, F_RET(FP)
              12:        JUMP  LOPPU
              13:        COMP  R1, =1
              14:        JNEQU *+3
              15:        STORE R1, F_RET(FP)
              16:        JUMP  LOPPU
              17:        LOAD  R2, R1
              18:        SUB   R2, =1
              19:        LOAD  R3, R2
              20:        SUB   R3, =1
              21:        PUSH  SP, =0
              22:        PUSH  SP, R2
              23:        CALL  SP, F
              24:        POP   SP, R2
              25:        PUSH  SP, =0
              26:        PUSH  SP, R3
              27:        CALL  SP, F
              28:        POP   SP, R3
              29:        ADD   R2, R3
              30:        STORE R2, F_RET(FP)
              31: LOPPU  EXIT  SP, =1    
    
    

  6. Ttk-91-koneen konekäskyn osoiteosa on vain 16-bittinen. Tämä asettaa rajoituksia käskyssä olevien vakioiden koolle.
    1. Mikä on suurin positiivinen luku, joka voidaan esittää käskyssä vakiona?
    2. Mikä on pienin negatiivinen luku, joka voidaan esittää käskyssä vakiona?
    3. Miten tulee toimia, jos tarvitaankin suurempaa vakiota? Esimerkiksi lukua 500000?
    4. Entä miten tulisi menetellä, jos tarvitaan suurta vakiota indeksoidun osoitusmoodin kanssa? Esimerkiksi, jos halutaan lukea data osoitteesta (R1)+666666?