5 Aliohjelmien toteutus 5 1 Aliohjelmat ja parametrit

  • Slides: 60
Download presentation
5. Aliohjelmien toteutus 5. 1 Aliohjelmat ja parametrit 5. 2 Aktivointitietue ja aktivointitietuepino 5.

5. Aliohjelmien toteutus 5. 1 Aliohjelmat ja parametrit 5. 2 Aktivointitietue ja aktivointitietuepino 5. 3 Esimerkkejä aktiv 5. 4. Rekursio 9/25/2020 Liisa Marttinen kevät 2005 1

5. 1 Aliohjelmat ja parametrit n Korkean tason ohjelmointikielen käsitteet n aliohjelma, proseduuri n

5. 1 Aliohjelmat ja parametrit n Korkean tason ohjelmointikielen käsitteet n aliohjelma, proseduuri n n funktio n n parametrit, paluuarvo metodi n n parametrit, voi olla myös paluuarvo Näitä vastaavat konekielen käsitteet n aliohjelma n 9/25/2020 parametrit, paluuarvot Liisa Marttinen kevät 2005 2

Muodolliset ja todelliset parametrit n muodolliset parametrit n n aliohjelman koodissa määritellyt minkä tyyppisiä

Muodolliset ja todelliset parametrit n muodolliset parametrit n n aliohjelman koodissa määritellyt minkä tyyppisiä parametreja ja missä järjestyksessä kutsussa on annettava int Summa (int x, int y); paluuarvon tyyppi Tulosta (char *p); todelliset parametrit ja paluuarvo n kutsuttaessa sijoitetaan todelliset parametrit kutsuun n funktio palauttaa paluuarvon Tulosta(Taulu); i=Summa(a, b); 9/25/2020 Liisa Marttinen kevät 2005 3

Parametrityypit n arvoparametri n n aliohjelmalle välitetään parametrin arvo eli aliohjelma saa käyttöönsä kopion

Parametrityypit n arvoparametri n n aliohjelmalle välitetään parametrin arvo eli aliohjelma saa käyttöönsä kopion parametrista n n n esim. Javassa ja C: ssä kaikki parametrit parametri voi olla muuttuja, vakio, lauseke, olioviite, osoitin aliohjelma voi lukea ja muuttaa vain kopion arvoa ei todellisen parametrin arvoa viiteparametri n n aliohjelmalle välitetään parametrin osoite n n Pascalissa, Adassa, C++: ssä myös muuttujan, osoitinmuuttujan, tietueen, aliohjelman , . . . osoite aliohjelma voi lukea ja muuttaa todellisen parametrin arvoa 9/25/2020 Liisa Marttinen kevät 2005 4

Tätä ei käsitellä jatkossa! Parametrityypit (2) n nimiparametri n välitetään parametrin nimi (merkkijono) n

Tätä ei käsitellä jatkossa! Parametrityypit (2) n nimiparametri n välitetään parametrin nimi (merkkijono) n n Algol-ohjelmointikielessä merkkijono kuvataan arvoksi kutsuhetkellä ja semantiikka määräytyy vasta kutsuhetkellä n n n muodollinen nimiparametri korvataan todellisella parametrilla eli merkkijonolla joka viittauskohdassa void Vaihda(name int x, y) { sivuvaikutuksia! int t; makroissa käytössä t: =x; x: =y; y: =t; Vaihda (i, T[i]); ; 2 T[2] t: =i; i: =T[i]; T[i]: =t i=2, T[2]=5; => t=2, i=5, T[5]=2 9/25/2020 Liisa Marttinen kevät 2005 } Vaihda (i, j); t: =i; i: =j; j: =t 5

Arvoparametri n n Aliohjelmalla käytössä vain kopio todellisesta parametrista (sen arvo) => ei voi

Arvoparametri n n Aliohjelmalla käytössä vain kopio todellisesta parametrista (sen arvo) => ei voi muuttaa todellisen parametrin arvoa. Jos parametrina on osoitinmuuttuja, niin sen osoittaman muuttujan arvoa voi muuttaa, mutta ei itse osoitinmuuttujan arvoa! Count (a, p ); Summa (a, b); a=3, b=2 int Summa (int x, int y) { int z; z= x+y; return z; { 9/25/2020 x=3 y=2 a=6, p Count (int x, * Ptrb) {. . . x=10; *Ptrb =10 { Liisa Marttinen kevät 2005 10 100 x=610 Ptrb 6

Add(x, Sum); Viiteparametri n n Välitetään todellisen parametrin osoite. Aliohjelma voi muuttaa parametrin osoittaman

Add(x, Sum); Viiteparametri n n Välitetään todellisen parametrin osoite. Aliohjelma voi muuttaa parametrin osoittaman muuttujan arvoa. Aliohjelmassa Ali käskyt Välitetty viiteparametrina pääohjelman muuttujan A osoite Pa. Ali. . . LOAD R 2, @P ADD 10 R 2, =10 STORE R 2, @P 9/25/2020 A=100: Ali(Pa); Pa=100: A=100: 20 Liisa Marttinen kevät 2005 7

Parametrien välitys konekielessä n Parametrit vältetään normaalisti pinon avulla n pääohjelmassa ennen aliohjelman kutsua

Parametrien välitys konekielessä n Parametrit vältetään normaalisti pinon avulla n pääohjelmassa ennen aliohjelman kutsua parametrit viedään pinoon n n arvoparametrista parametrin arvo viiteparametrista parametrin osoite aliohjelmassa (usein alussa) parametrit luetaan pinosta aliohjelman lopussa paluuarvot (’tulosparametrit’) talletetaan pinoon. 9/25/2020 Liisa Marttinen kevät 2005 8

Aliohjelman toteutuksessa tarpeen n paluuosoite n n aliohjelman parametrien välitys paluuarvon (paluuarvojen) välitys rekistereiden

Aliohjelman toteutuksessa tarpeen n paluuosoite n n aliohjelman parametrien välitys paluuarvon (paluuarvojen) välitys rekistereiden käyttö n n aliohjelmasta palattava kutsua seuraavaan käskyyn kutsuvalla ja kutsutulla aliohjelmalla käytössä sama rekisterijoukko => kutsuvan arvot talteen tilavaraukset aliohjelman paikallisille muuttujille n dynaaminen muistivaraus pinosta 9/25/2020 Liisa Marttinen kevät 2005 9

Aktivointitietue n aliohjelman toteutusmuoto n n (TTK-91) funktion paluuarvot kaikkien parametrien arvot paluuosoite kutsujan

Aktivointitietue n aliohjelman toteutusmuoto n n (TTK-91) funktion paluuarvot kaikkien parametrien arvot paluuosoite kutsujan aktivointitietueen osoitin (vanha FP) n n n aktivointitietueen osoitin FP kutsuhetkellä paikalliset muuttujat talteen laitettuja rekistereiden arvoja 9/25/2020 Liisa Marttinen kevät 2005 Ohjelmakoodit ja globaalit muuttujat paluuarvo(t) parametri x parametri y vanha PC vanha FP paikall. m a paikall. m b vanha rek. arvo 10

Osoittimet SP ja FP n SP osoittaa pinon huipulle eli pinon päällimmäiseen alkioon n

Osoittimet SP ja FP n SP osoittaa pinon huipulle eli pinon päällimmäiseen alkioon n n ohjelman suorituksen alussa pino on tyhjä ja SP osoittaa kääntäjän varaaman koodille ja globaaleille muuttujille varaaman alueen loppuun FP osoittaa (ali)ohjelman ympäristön pinossa n n n osoittaa (ali)ohjelman aktivointitietuetta edeltävän muistipaikan eli edellisen aktivointitietueen osoitteeseen ohjelman alussa viimeiseen ohjelman käskyyn ens. globaalimuuttujan tilanvaraus paikkaan FP+1 9/25/2020 Liisa Marttinen kevät 2005 11

Pääohjelma CALL SP, Alia 85: 92: 100: 132: 210: CALL SP, Alia aliohjelma Alia

Pääohjelma CALL SP, Alia 85: 92: 100: 132: 210: CALL SP, Alia aliohjelma Alia CALL SP, Alib …… EXIT SP, 1 aliohjelma Alib EXIT SP, 2 Pinoon talletetaan aliohjelmaan siirtymiseen ja sieltä palaamiseen liittyvää tietoa Pääohjelma: …. CALL SP, Alia mennään suorittamaan aliohjelman Alia 1. käskyä Alia: CALL SP, Alib mennään suorittamaan aliohjelman Alib 1. käskyä Alib: EXIT SP, 2 palataan aliohjelmaan Alia, kutsun jälkeiseen kohtaan (= mp 133) 12

Aliohjelmaan siirryttäessä on: n varattava tilaa pinosta paluuarvoa varten n vietävä parametrit pinoon n

Aliohjelmaan siirryttäessä on: n varattava tilaa pinosta paluuarvoa varten n vietävä parametrit pinoon n talletettava paluuosoite pinoon (= vanha PC) n talletettava pinoon FP: n vanha arvo n asetettava FP osoittamaan uuden paikallisen tilanvarauksen alkuun n PC: n arvoksi aliohjelman 1. käskyn osoite n rekisterien talletus pinoon Kutsuva rutiini hoitaa CALL-käsky hoitaa 13

koko ohjelman viimeinen käsky tilanvaraukset valekäskyillä FP ohjelman alussa Alia: n aktivointitietue FP ------>

koko ohjelman viimeinen käsky tilanvaraukset valekäskyillä FP ohjelman alussa Alia: n aktivointitietue FP ------> - funktion palautusarvo - parametrit - paluuosoite - edellinen aktivointitietue - Alian omat tilanvaraukset Alib: n aktivointitietue SP ------> - funktion palautusarvo - parametrit - paluuosoite - edellinen aktivointitietue - Alib: n omat varaukset Pinon tila ennen Alib: sta poistumista 14

Kutsujan toiminnot n varaa tilaa paluuarvo(i)lle n n vie pinoon parametrit n n n

Kutsujan toiminnot n varaa tilaa paluuarvo(i)lle n n vie pinoon parametrit n n n PUSH SP, =0 (arvot tai osoitteet) PUSH SP, =200 ; arvo 200 PUSH SP, =Taulu ; Taulu: n osoite kutsu aliohjelmaa n 9/25/2020 CALL SP, Alia Liisa Marttinen kevät 2005 15

CALL-käskyn toiminnot n CALL SP, ’aliohjelma’ n tallettaa pinoon n paluuosoitteen (PC: arvo) ympäristöosoitteen

CALL-käskyn toiminnot n CALL SP, ’aliohjelma’ n tallettaa pinoon n paluuosoitteen (PC: arvo) ympäristöosoitteen (FP: n arvo) asettaa uudet arvot n n PC: lle (= aliohjelman 1. käskyn osoite, joka on käskyn 2. operandina) FP: lle (= pino-osoittimen SP arvo) 16

Aliohjelmassa n n n varataan pinosta tilaa paikallisille muuttujille talletetaan pinoon aliohjelman käyttämien rekisterien

Aliohjelmassa n n n varataan pinosta tilaa paikallisille muuttujille talletetaan pinoon aliohjelman käyttämien rekisterien arvot (suoritetaan aliohjelman varsinaiset toiminnot) palautetaan rekisterien arvot vapautetaan paikallisten muuttujien tilat aliohjelman koodin alussa alkutoiminnot (prologi) ja lopussa lopetustoiminnot (epilogi) 9/25/2020 Liisa Marttinen kevät 2005 17

Paluu takaisin pääohjelmaan n n talteen laitetun paluuosoitteen arvo PC: n uudeksi arvoksi FP-osoitin

Paluu takaisin pääohjelmaan n n talteen laitetun paluuosoitteen arvo PC: n uudeksi arvoksi FP-osoitin osoittamaan taas kutsuneen ohjelman aktivointitietuetta parametrien varaaman tilan vapauttaminen paluuarvon ottaminen pinosta EXIT-käsky hoitaa 9/25/2020 kutsuva ohjelma hoitaa Liisa Marttinen kevät 2005 18

EXIT-käsky n EXIT SP, ’param. lkm’ n palauttaa n n n 9/25/2020 paluuosoitteen (PC:

EXIT-käsky n EXIT SP, ’param. lkm’ n palauttaa n n n 9/25/2020 paluuosoitteen (PC: arvo) ympäristöosoitteen (FP: n arvo) vähentää pino-osoitinta parametrien määrällä Liisa Marttinen kevät 2005 19

Kutsuva ohjelma n ottaa paluuarvon pinosta n 9/25/2020 POP SP, R 2 ; 2.

Kutsuva ohjelma n ottaa paluuarvon pinosta n 9/25/2020 POP SP, R 2 ; 2. operandi aina rekisteri STORE R 2, Tulos ; paluuarvon talteen OUT R 2, =CRT; tulostetaan Liisa Marttinen kevät 2005 20

Esimerkki: Yksinkertainen aliohjelma n n Aliohjelma Kuluta. Aikaa void Kuluta. Aikaa(int Lkm) { int

Esimerkki: Yksinkertainen aliohjelma n n Aliohjelma Kuluta. Aikaa void Kuluta. Aikaa(int Lkm) { int i; for (i=0; i <= Lkm; i++) Tulosta (i); } n Aliohjelmalla on yksi arvoparametri Pääohjelma kutsuu aliohjelmaa kahdesti arvoilla 1000 ja 5. 21

n Pääohjelma 0: 1: 2: 3: 4: n n n PUSH SP, =1000 CALL

n Pääohjelma 0: 1: 2: 3: 4: n n n PUSH SP, =1000 CALL SP, Kul. Ai PUSH SP, =5 CALL SP, Kul. Ai SVC SP, =HALT Ei staattisia tilanvarauksia Parametrin arvo välitetään pinossa Rekistereiden talletusta ei tarvita 22

n Aliohjelma Kul. Ai: 5: Kul. Ai 6: Viela 7: 8: 9: 10: 11:

n Aliohjelma Kul. Ai: 5: Kul. Ai 6: Viela 7: 8: 9: 10: 11: Pois n LOAD COMP JGRE OUT ADD JUMP EXIT R 1, =1 R 1, -2(FP) Pois R 1, =CRT R 1, =1 Viela SP, =1 Aliohjelma ei tarvitse paikallisia tilanvarauksia 23

n Tilanne ennen suorituksen alkamista 0: 1: 2: 3: 4: Pino PUSH CALL SVC

n Tilanne ennen suorituksen alkamista 0: 1: 2: 3: 4: Pino PUSH CALL SVC SP, =1000 SP, Kul. Ai SP, =5 SP, Kul. Ai SP, =HALT 5: Kul. Ai LOAD R 1, =1 6: Viela COMP R 1, -2(FP) 7: JGRE Pois 8: OUT R 1, =CRT 9: ADD R 1, =1 10: JUMP Viela 11: Pois EXIT SP, =1 Pääohjelma PC = 0 Aliohjelma Kul. Ai SP =11 FP =11 24

n 0: PUSH SP, =1000 0: 1: 2: 3: 4: Pino PUSH CALL SVC

n 0: PUSH SP, =1000 0: 1: 2: 3: 4: Pino PUSH CALL SVC SP, =1000 SP, Kul. Ai SP, =5 SP, Kul. Ai SP, =HALT 5: Kul. Ai LOAD R 1, =1 6: Viela COMP R 1, -2(FP) 7: JGRE Pois 8: OUT R 1, =CRT 9: ADD R 1, =1 10: JUMP Viela 11: Pois EXIT SP, =1 12: 1000 Pääohjelma PC = 1 Aliohjelma Kul. Ai FP =11 SP =12 25

n 1: CALL SP, Kul. Ai 0: 1: 2: 3: 4: Pino PUSH CALL

n 1: CALL SP, Kul. Ai 0: 1: 2: 3: 4: Pino PUSH CALL SVC SP, =1000 SP, Kul. Ai SP, =5 SP, Kul. Ai SP, =HALT 5: Kul. Ai LOAD R 1, =1 6: Viela COMP R 1, -2(FP) 7: JGRE Pois 8: OUT R 1, =CRT 9: ADD R 1, =1 10: JUMP Viela 11: Pois EXIT SP, =1 12: 13: 14: 1000 2 (PC) 11 (FP) Pääohjelma Aliohjelma Kul. Ai PC = 5 FP =14 SP =14 26

n 6: Viela COMP R 1, -2(FP) 0: 1: 2: 3: 4: verrataan tähän

n 6: Viela COMP R 1, -2(FP) 0: 1: 2: 3: 4: verrataan tähän Pino PUSH CALL SVC SP, =1000 SP, Kul. Ai SP, =5 SP, Kul. Ai SP, =HALT 5: Kul. Ai LOAD R 1, =1 6: Viela COMP R 1, -2(FP) 7: JGRE Pois 8: OUT R 1, =CRT 9: ADD R 1, =1 10: JUMP Viela 11: Pois EXIT SP, =1 12: 13: 14: 1000 2 (PC) 11 (FP) Pääohjelma Aliohjelma Kul. Ai PC = 7 Parametri on paikassa FP-2 FP =14 SP =14 27

n 11: Pois EXIT SP, =1 0: 1: 2: 3: 4: Pino PUSH CALL

n 11: Pois EXIT SP, =1 0: 1: 2: 3: 4: Pino PUSH CALL SVC SP, =1000 SP, Kul. Ai SP, =5 SP, Kul. Ai SP, =HALT 5: Kul. Ai LOAD R 1, =1 6: Viela COMP R 1, -2(FP) 7: JGRE Pois 8: OUT R 1, =CRT 9: ADD R 1, =1 10: JUMP Viela 11: Pois EXIT SP, =1 Pääohjelma PC = 2 Aliohjelma Kul. Ai FP = 11 SP = 11 28

Arvo- ja viiteparametri aliohjelmassa n n Laadi aliohjelma Laske, joka suorittaa laskutoimituksen x=n+10. Luku

Arvo- ja viiteparametri aliohjelmassa n n Laadi aliohjelma Laske, joka suorittaa laskutoimituksen x=n+10. Luku n annetaan aliohjelmalle arvoparametrina ja tulos x palautetaan pääohjelmalle viiteparametrina. Pääohjelma kutsuu aliohjelmaa kerran parametreina n=15 ja M, joka on se pääohjelman muuttuja, johon tulos halutaan. n Pääohjelma tulostaa näytölle tuloksen. 29

n Pääohjelman koodi M DS 1 00: Main LOAD R 1, =15 01: PUSH

n Pääohjelman koodi M DS 1 00: Main LOAD R 1, =15 01: PUSH SP, R 1 luku 15 pinoon 02: PUSH SP, =M muuttujan M osoite 03: CALL SP, Laske aliohjelmakutsu 04: LOAD R 2, M 05: 06: OUT SVC ensin parametrit pinoon: R 2<= tulos R 2, =CRT tulostus näytölle SP, =HALT 30

n Aliohjelman koodi n x k 07: Laske 08: EQU EQU PUSH LOAD -3

n Aliohjelman koodi n x k 07: Laske 08: EQU EQU PUSH LOAD -3 -2 10 SP, R 3 ; rekisterin R 3 arvo talteen R 3, n(FP) ; R 3<= arvoparametri 09: ADD 10: 11: 12: STORE R 3, @x(FP) ; talletus viiteparametriin POP SP, R 3 ; palautetaan R 3 ennalleen EXIT SP, =2 ; paluu: 2 parametria R 3, =k ; R 3<= R 3+10 31

n Muistin sisältö ohjelmakutsun jälkeen 0: 10: 11: Ohjelma + aliohjelma (M) varattu muuttujalle,

n Muistin sisältö ohjelmakutsun jälkeen 0: 10: 11: Ohjelma + aliohjelma (M) varattu muuttujalle, M = 11 -3(FP) 12: 15 arvoparametri -2(FP) 13: 11 (=M) viiteparametri 14: 4 (= vanha PC) 15: 10 (= vanha FP) SP, FP 32

n Muistin sisältö aliohjelmasta paluun jälkeen. 0: FP SP Ohjelma + aliohjelma 10: 11:

n Muistin sisältö aliohjelmasta paluun jälkeen. 0: FP SP Ohjelma + aliohjelma 10: 11: 25 12: 15 13: 11 (=M) 14: 4 (= vanha PC) 15: 10 (= vanha FP) PC = 4 varattu muuttujalle, M = 11 Pinoon jäänyttä ’roskaa’. 33

Monipuolinen esimerkki n pääohjelma n n kutsuu aliohjelmia ja tulostaa niiden laskemia arvoja kaksi

Monipuolinen esimerkki n pääohjelma n n kutsuu aliohjelmia ja tulostaa niiden laskemia arvoja kaksi aliohjelmaa n proseduuri n n laskee summaa käyttäen pääohjelman globaaleja muuttujia, funktion palauttamaa arvoa ja arvoparametria, summa talletetaan viiteparametrina annettuun muuttujaan funktio n palauttaa arvoparametrina annetun luvun neliön 34

n n funktio Sqr(int n) int Sqr(int n) { return n*n; } proseduuri Summa

n n funktio Sqr(int n) int Sqr(int n) { return n*n; } proseduuri Summa (int &X, int Y) void Summa (int &X, int Y) { int Z; Z = A + B; // A ja B globaaleja muuttujia X = Sqr(X) + Y +Z+5; } 35

n Pääohjelma: int A, B; lue luku A; B = Sqr(2); tulosta B; Summa(B,

n Pääohjelma: int A, B; lue luku A; B = Sqr(2); tulosta B; Summa(B, A); tulosta B; 36

n Pääohjelma: A DS 1 B DS 1 00: Main IN R 3, =KBD

n Pääohjelma: A DS 1 B DS 1 00: Main IN R 3, =KBD 01: STORE R 3, A 02: 03: 04: 05: PUSH CALL POP SP, =0 ; paluuarvolle paikka SP, =2 ; arvoparametri SP, Sqr SP, R 2 ; paluuarvo muuttujaan B 06: STORE R 2, B 37

Pääohjelma jatkuu: 07: 08: 09: 10: 11: 12: 13: OUT PUSH CALL LOAD OUT

Pääohjelma jatkuu: 07: 08: 09: 10: 11: 12: 13: OUT PUSH CALL LOAD OUT SVC R 2, =CRT SP, =B SP, A SP, Summa R 2, B R 2, =CRT SP, =HALT 38

n Aliohjelmat n EQU -2 Sqr_Ret EQU -3 14: Sqr LOAD R 3, n(FP)

n Aliohjelmat n EQU -2 Sqr_Ret EQU -3 14: Sqr LOAD R 3, n(FP) 15: MUL R 3, R 3 16: STORE R 3, Sqr_Ret(FP) 17: EXIT SP, =1 39

X Y Z EQU EQU -3 -2 1 18: Summa PUSH SP, =0 19:

X Y Z EQU EQU -3 -2 1 18: Summa PUSH SP, =0 19: LOAD R 1, A 20: ADD R 1, B ; tilaa Z: lle 21: STORE R 1, Z(FP) 22: PUSH SP, =0 23: 24: PUSH SP, @X(FP) CALL SP, Sqr ; Z= A+B ; paluuarvo ; arvoparametri 40

Proseduuri Summa jatkuu: 25: 26: 27: 28: 29: 30: POP ADD ADD STORE EXIT

Proseduuri Summa jatkuu: 25: 26: 27: 28: 29: 30: POP ADD ADD STORE EXIT SP, R 3, Y(FP) R 3, =5 R 3, Z(FP) R 3, @X(FP) SP, =2 41

pääohjelma Sqr CALL SP, Sqr EXIT SP, =1 CALL SP, Summa CALL Sqr SVC

pääohjelma Sqr CALL SP, Sqr EXIT SP, =1 CALL SP, Summa CALL Sqr SVC SP, =HALT EXIT SP, =2 Summa 42

n Pino ohjelman alussa 0: Ohjelma + aliohjelmat 30: 31: 32: FP (A) eli

n Pino ohjelman alussa 0: Ohjelma + aliohjelmat 30: 31: 32: FP (A) eli paikka A: lle (B) eli paikka B: lle SP 43

n Pino ohjelman suoritettua käskyt PUSH SP, =0 ja PUSH SP, =2 0: Ohjelma

n Pino ohjelman suoritettua käskyt PUSH SP, =0 ja PUSH SP, =2 0: Ohjelma + aliohjelmat 30: 31: FP (A) eli paikka A: lle 32: (B) eli paikka B: lle 33: 0 (paluuarvolle) 34: 2 (arvoparametri) SP 44

n Pino ohjelman suoritettua aliohjelmakutsun CALL SP, Sqr 0: Ohjelma + aliohjelmat 30: 31:

n Pino ohjelman suoritettua aliohjelmakutsun CALL SP, Sqr 0: Ohjelma + aliohjelmat 30: 31: (A) eli paikka A: lle 32: (B) eli paikka B: lle 33: 0 (paluuarvolle) 34: 2 (arvoparametri) 35: 5 (vanha PC) 36: 30 (vanha FP) -3(FP) -2(FP) FP SP 45

n Pino aliohjelman Sqr suoritettua käskyn STORE R 3, Sqr_Ret(PF) 0: Ohjelma + aliohjelmat

n Pino aliohjelman Sqr suoritettua käskyn STORE R 3, Sqr_Ret(PF) 0: Ohjelma + aliohjelmat 30: 31: (A) eli paikka A: lle 32: (B) eli paikka B: lle 33: 4 (paluuarvo) 34: 2 (arvoparametri) 35: 5 (vanha PC) 36: 30 (vanha FP) -3(FP) -2(FP) FP SP 46

n Pino aliohjelmasta Sqr paluun jälkeen (EXIT SP, =1) 0: Ohjelma + aliohjelmat 30:

n Pino aliohjelmasta Sqr paluun jälkeen (EXIT SP, =1) 0: Ohjelma + aliohjelmat 30: 31: FP (A) eli paikka A: lle 32: (B) eli paikka B: lle 33: 4 (Sqr: n paluuarvo) SP 34: 47

n Pino pääohjelman käskyjen POP SP, R 2 ja STORE R 2, B jälkeen:

n Pino pääohjelman käskyjen POP SP, R 2 ja STORE R 2, B jälkeen: 0: Ohjelma + aliohjelmat 30: 31: 32: (A) eli paikka A: lle (B) eli paikka B: lle: 4 FP SP 33: 34: 48

n Pino pääohjelman käskyjen PUSH SP, =B, PUSH SP, A ja CALL SP, Summa

n Pino pääohjelman käskyjen PUSH SP, =B, PUSH SP, A ja CALL SP, Summa jälkeen 0: Ohjelma + aliohjelmat 30: 31: (A) eli paikka A: lle 32: (B) eli paikka B: lle: 4 33: 32 (viiteparametri) 34: A (luettu luku) 35: 11 (vanha PC) 36: 30 (vanha FP) -3(FP) -2(FP) FP SP 49

n Pino aliohjelman Summa alussa: PUSH SP, =0 0: 31: 32: 33: Ohjelma +

n Pino aliohjelman Summa alussa: PUSH SP, =0 0: 31: 32: 33: Ohjelma + aliohjelmat (A) eli paikka A: lle (B) eli paikka B: lle: 4 32 34: A 35: 11 (vanha PC) 36: 30 (edell. FP) FP 37: 0 (Z: n tilanvaraus) SP 50

n Pino aliohjelman Summa alussa: STORE R 1, Z(FP) 0: 31: 32: 33: Ohjelma

n Pino aliohjelman Summa alussa: STORE R 1, Z(FP) 0: 31: 32: 33: Ohjelma + aliohjelmat (A) eli paikka A: lle (B) eli paikka B: lle: 4 32 34: A 35: 11 (vanha PC) 36: 30 (edell. FP) FP 37: A+B SP 51

n Pino Summan kutsuttua Sqr: ää: CALL SP, Sqr 0: 31: Ohjelma + aliohjelmat

n Pino Summan kutsuttua Sqr: ää: CALL SP, Sqr 0: 31: Ohjelma + aliohjelmat @X(F P) = MEM[33]] = MEM[32] = 4 (A) eli paikka A: lle 32: (B) eli paikka B: lle: 4 33: 32 34: A 35: 11 (vanha PC) 36: 30 (edell. FP) 37: (Z): A+B 38: 0 (paluuarvolle) 39: 40: 41: 4 25 (PC) 36 (FP) X(FP) = -3(FP) = 36 -3 = 33 PUSH SP, @X(FP) arvoparametri aliohjelman itse viiteparametrina saamasta FP SP 52

n Pino kun Summaan palattu Sqr: stä: EXIT SP, =1 0: 31: 32: 33:

n Pino kun Summaan palattu Sqr: stä: EXIT SP, =1 0: 31: 32: 33: Ohjelma + aliohjelmat (A) eli paikka A: lle (B) eli paikka B: lle 32 34: A 35: 11 (vanha PC) 36: 30 (edell. FP) 37: A+B 38: 16 (paluuarvo) 39: 40: 41: FP SP 53

n Pino kun Summassa suoritettu POP SP, R 3 0: 31: 32: 33: Ohjelma

n Pino kun Summassa suoritettu POP SP, R 3 0: 31: 32: 33: Ohjelma + aliohjelmat (A) eli paikka A: lle (B) eli paikka B: lle 32 34: A 35: 11 (vanha PC) 36: 30 (edell. FP) 37: A+B FP SP 38: 39: 40: 41: 54

n Pino kun Summassa suoritettu STORE R 3, @X(FP) 0: 31: 32: 33: Ohjelma

n Pino kun Summassa suoritettu STORE R 3, @X(FP) 0: 31: 32: 33: Ohjelma + aliohjelmat (A) eli paikka A: lle (B) eli paikka B: lle 32 34: A 35: 11 (vanha PC) 36: 30 (edell. FP) 37: A+B MEM[33]] = MEM[32] <= R 3 X(FP) = -3(FP) =36 -3 = 33 FP SP 38: 39: 40: 41: 55

n Summasta palattu pääohjelmaan: EXIT SP, =2 0: 31: 32: 33: Ohjelma + aliohjelmat

n Summasta palattu pääohjelmaan: EXIT SP, =2 0: 31: 32: 33: Ohjelma + aliohjelmat FP (A) eli paikka A: lle Summan saama arvo SP 34: 35: 36: 37: 38: 39: 40: 41: 56

5. 4. Rekursiivinen aliohjelma n n n aliohjelma kutsuu itseään jatkuvasti muuten toiminta ei

5. 4. Rekursiivinen aliohjelma n n n aliohjelma kutsuu itseään jatkuvasti muuten toiminta ei eroa mitenkään joka kutsukerralla muodostuu uusi aktivointitietue n n n johon varataan tilat paikallisille muuttujille parametreille ja paluuarvoille Joka kutsukerralla suoritetaan sama koodi, mutta kunkin suorituksen dataa varten on oma aktivointitietue. 9/25/2020 Liisa Marttinen kevät 2005 57

Esimerkki rekursiosta: kertoman laskeminen Kutsu: int f. Pow(int n) { K if (n==1) return

Esimerkki rekursiosta: kertoman laskeminen Kutsu: int f. Pow(int n) { K if (n==1) return (1); …. k = f. Pow(4); 9/25/2020 0 ; koodataan k=f. Pow(4) else return (n*f. Pow(n-1)); void main () { DC PUSH SP, =0 ; paluuarvo PUSH SP, =4 ; parametri CALL SP, f. Pow; POP SP, R 1 STORE R 1, K Liisa Marttinen kevät 2005 58

Rekursion toteutus int f. Pow(int n) { if (n==1) return (1); else return (n*f.

Rekursion toteutus int f. Pow(int n) { if (n==1) return (1); else return (n*f. Pow(n-1)); void main () { …. k = f. Pow(4); paluuarvo parametri n vanha PC FP vanha FP SP vanha R 1 9/25/2020 par. Ret EQU -3 par. N EQU -2 f. Pow PUSH SP, R 1 ; talteen LOAD R 1, par. N(FP) COMP R 1, =1 JEQU One ; return f. Pow(N-1)*N SUB R 1, =1 PUSH SP, =0 PUSH SP, R 1 CALL SP, f. Pow POP SP, R 1 MUL R 1, par. N(FP) One STORE R 1, par. Ret(FP) POP SP, R 1 EXIT SP, =1 Liisa Marttinen kevät 2005 59

KJ-palvelun kutsu n toimii samalla tavalla kuin aliohjelman kutsu n n SVC SP, =Read.

KJ-palvelun kutsu n toimii samalla tavalla kuin aliohjelman kutsu n n SVC SP, =Read. File, IRET Paluuarvo (OK =0, … PUSH SP, =0 PUSH SP, =File. Buffer PUSH SP, Char. Count PUSH SP, File. Ptr SVC SP, Read. File POP SP, R 1 JNZER R 1, File. Trouble virhe >0) 9/25/2020 …. Liisa Marttinen kevät 2005 60