Aliohjelmien toteutus (Subroutine implementation)
Transcription
Aliohjelmien toteutus (Subroutine implementation)
Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Tyypit Aktivointitietue (AT) AT-pino, AT pino, rekursio 10.11.2015 Copyright 2015 Teemu Kerola 1 Aliohjelmatyypit • Korkean tason ohjelmointikielen käsitteet – aliohjelma, aliohjelma proseduuri • Parametrit (sisäänmeno- ja ulostuloparametrit) – funktio • parametrit, paluuarvo – metodi • parametrit, ehkä paluuarvo • Konekielitason vastaava käsite – aliohjelma • parametrit ja paluuarvo(t) 10.11.2015 Copyright 2015 Teemu Kerola 2 Parametrit ja paluuarvo • Muodolliset parametrit – määritelty aliohjelmassa ohjelmointihetkellä – tietty järjestys ja tyyppi – paluuarvot Tulosta (int x, y) void Tulosta (int x, y) Laske(int x): int int Laske(int x) • käsittely hyvin samalla tavalla kuin parametreillekin • Todelliset p parametrit jja paluuarvo p Tulosta (5, apu+1); – todelliset parametrit sijoitetaan muodollisten parametrien x = Laske( y+234); paikalle ik ll kutsuhetkellä k h k ll suoritusaikana i ik – paluuarvo saadaan paluuhetkellä ja sitä käytetään kuten mitä tahansa arvoa käytetään, 10.11.2015 Copyright 2015 Teemu Kerola 3 Parametrityypit • Arvoparametri – välitetään todellisen parametrin arvo (eli sen kopio) kutsuhetkellä – arvo voidaan lukea – alkuperäistä upe s arvoa vo ei e voi vo muuttaa, uu , mutta u arvon vo kopiota op o voi vo muuttaa uu • Viiteparametri – välitetään todellisen parametrin osoite – arvo jja osoite voidaan lukea,, arvoa voi muuttaa – Aliohjelma voi muuttaa pääohjelman dataa • Nimiparametri (yleensä vain tulkittavissa skriptikielissä) – välitetään todellisen p parametrin nimi ((merkkijono) j ) – nimi (merkkijono) kuvataan arvoksi kutsuhetkellä – semantiikka määräytyy vasta kutsuhetkellä swap(i j) -- makro, swap(i, makro nimiparametrit tmp = i; i = j; j = tmp; 10.11.2015 swap(x, y); swap(k, T[k]); Copyright 2015 Teemu Kerola tmp = x;; x = y; y = tmp; tmp = k; k = T[k]; [ ] T[k] = tmp; Keskustele 4 Aliohjelmien toteutuksen osat • Paluuosoite – kutsukohtaa seuraavan käskyn osoite • • • • Parametrien välitys Paluuarvon välitys Paikalliset muuttujat Rekisterien varaus (allokointi) – Kutsuva ohjelman osa haluaa säilyttää käyttämiensä rekisterien arvot! • pääohjelma, toinen aliohjelma, sama aliohjelma, metodi, … – Aliohjelman pitää aluksi tallettaa (muistiin) käytettävien rekisterien arvot ja lopuksi palauttaa ne ennalleen 10.11.2015 Copyright 2015 Teemu Kerola 5 Aktivointitietue (activation record, activation frame) int funcA (int x,y); • Aliohjelman j toteutus (ttk-91) ( ) – funktion paluuarvo (tai kaikki paluuarvot) – kaikkien (sisäänmeno- ja ulostulo-) parametrien arvot – paluuosoite FP – kutsukohdan aktivointitietue – kaikki ppaikalliset muuttujat j ja j tietorakenteet – aliohjelman ajaksi talletettujen rekistereiden ki t id alkuperäiset lk äi t arvott 10.11.2015 Copyright 2015 Teemu Kerola pino i paluuarvo param x param y vanha PC vanha FP paik. m. i1 ppaik. m. i2 vanha R1 vanha R2 -22 +1 SP kasvava muistiosoite 6 Aktivointitietuepino muistissa • Aktivointitietueet (AT) varataan ja vapautetaan dynaamisesti (suoritusaikana) pinosta (muistista) – SP (=R6) osoittaa pinon pinnalle • Aktivointitietuepino li kki linkki – FP (R7) osoittaa i voimassa i olevan l AT:n sovittuun kohtaan ((ttk-91: vanhan FP:n osoite)) • Pinossa olevaa AT:tä rakennetaan ja puretaan käskyillä: – PUSH, POP, PUSHR, POPR – CALL, EXIT (SVC, IRET) AT main kutsuu AT sum FP AT funcA SP kasvava muistiosoite Talleta R0-R5 pinoon 10.11.2015 Copyright 2015 Teemu Kerola 7 Aliohjelmakutsun toteutus • Toteutus T t t jaettu j tt erii yksiköille k iköill Kutsuva rutiini CALL käsky Kutsuttu rutiini EXIT käsky Kutsuva rutiini 10.11.2015 – – – – – – – – – – – varaa tilaa paluuarvolle pinosta laita pparametrit ((arvot tai osoitteet)) ppinoon talleta vanha PC ja FP, aseta uudet PC ja FP varaa tilaa paikallisille muuttujille prolog t ll t käytettävien talleta kä t ttä i rekistereiden ki t id vanhat arvot pinoon (itse aliohjelman toteutus – varsinainen työ) palauta rekistereiden arvot vapauta paikallisten muuttujien tila epilog palauta l t PC ja j FP vapauta parametrien tila ota ppaluuarvo ppinosta Copyright 2015 Teemu Kerola 8 Aliohjelmaesimerkki int fA (int x, y) { int z = 5; } z = x * z + y; return (z); … T = fA (200, R); käyttö: y R DC 24 … PUSH SP SP,=0 0 ; til tila paluuarvolle l ll PUSH SP, =200 muistista muistiin!! PUSH SP, R CALL SP SP, fA talleta PC, FP aseta PC, kutsu & paluu palauta FP, PC vapauta par tila POP SP R1 SP, STORE R1, T … 2. operandi di aina rekisteri … tämäntämän FP hetkinen, nykyinen FP 10.11.2015 arvo=1024 paluuarvo par x=200 par y=24 (13) Copyright 2015 Teemu Kerola Keskustele 9 (ei anim mointia)) Aliohjelmaesimerkki int fA (int x, y) { int z = 5; } z = x * z + y; return (z); … T = fA (200, R); käyttö: y R DC 24 … PUSH SP SP,=0 0 ; ret. t value l space PUSH SP, =200 muistista muistiin!! PUSH SP, R CALL SP SP, fA talleta PC, FP aseta PC, kutsu & paluu palauta FP, PC POP SP R1 SP, STORE R1, T … 2. operandi di aina rekisteri … tämäntämän FP hetkinen, nykyinen FP 10.11.2015 paluuarvo par x=200 par y=24 Copyright 2015 Teemu Kerola 10 toteutus: Aliohjelma- aliohjelman retfA EQU -4 # return value Q -3 # pparams esimerkki pparX EQU Kaikki viitteet näihin tehdään suhteessa FP:hen FP SP 10.11.2015 paluuarvo param x param y vanha PC vanha FP paik. z vanha R1 EQU -2 EQU 1 # local vars fA PUSH SP SP, =0 0 ; alloc ll Z PUSH SP, R1 ; save R1 LOAD R1, R1 =5; 5; init Z STORE R1, locZ (FP) LOAD R1,, pparX ((FP)) MUL R1, locZ (FP) ADD R1, parY (FP) STORE R1, locZ (FP) STORE R1 R1, retfA tfA (FP) POP SP, R1; recover R1 SUB SP, =1 ; free Z EXIT SP SP, =22 ; 2 param. param Copyright 2015 Teemu Kerola Keskustele epilog int fA (int x, y) { int z = 5;; z = x * z + y; return (z); } … T = fA (200, R); parY locZ prologg ((12)) 11 Kaikki viitteet näihin tehdään suhteessa FP:hen FP SP 10.11.2015 paluuarvo param x param y vanha PC vanha FP paik. z vanha R1 fA PUSH SP SP, =0 0 ; alloc ll Z PUSH SP, R1 ; save R1 prologg int fA (int x, y) { int z = 5; z = x * z + y; return (z); } … T = fA (200, R); aliohjelman toteutus: retfA EQU -4 pparX EQU Q -3 parY EQU -2 locZ EQU 1 LOAD R1, R1 =5; 5; init Z STORE R1, locZ (FP) LOAD R1,, pparX ((FP)) MUL R1, locZ (FP) ADD R1, parY (FP) STORE R1, locZ (FP) STORE R1 R1, retfA tfA (FP) POP SP, R1; recover R1 SUB SP, =1 ; free Z EXIT SP SP, =22 ; 2 param. param Copyright 2015 Teemu Kerola epilog (ei anim mointia)) Aliohjelmaesimerkki 12 Viiteparametri Kutsu T = fB(R, fB(R S, S T) R DC 24 S DC 56 T DC C 77 pT DC 0 ; pointer … LOAD R1, R1 =T ; initialize pT STORE R1, pT … PUSH SP SP,=0 0 ; tila paluuarvolle PUSH SP, R ; arvoparametri PUSH SP, =S ; viiteparametri PUSH SP,, p pT;; viiteparametri p CALL SP, fB POP SP, R1 STORE R1, T … 10.11.2015 Y ja Z ovat viiteparametreja: retfB EQU -5 ; paluuarvo parX EQU -44 ; arvoparametri vparY EQU -3 ; viiteparam vparZ EQU -2 ; viiteparam fB PUSH SP, R1 ; save R1 LOAD R1, parX (FP) MUL R1, @vparY (FP) ADD R1 R1, @vparZ (FP) STORE R1, retfB (FP) POP SP, R1; recover R1 EXIT SP, =3 ; 3 param. Copyright 2015 Teemu Kerola 13 KJ-palvelun kutsu (proseduraalisesti) • Samalla tavalla kuin aliohjelman kutsu • SVC kutsu fOK = ReadBlock (fp, 64) ... – CALL käskyn asemesta SVC PUSH SP, =0 ;paluuarvo (SuperVisor Call) PUSH SP, =FileBuffer • Tila paluuarvolle? SP, Ch CharCnt C t • Parametrit pinoon vai rekistereissä? PUSH SP PUSH SP, FilePtr (palvelukohtaisesti) – Kutsuttavan rutiinin numero operandina • • IRET paluu Paluuarvo (OK, virhe) pois pinosta tarkistusta varten 10.11.2015 SVC SP, =ReadFile POP SP, R1 SP JNZER R1, FileTrouble … Copyright 2015 Teemu Kerola Keskustele 14 Aliohjelmakutsun toteutus • Toteutus T t t jaettu j tt erii yksiköille k iköill Kutsuva rutiini CALL käsky Kutsuttu rutiini EXIT käsky Kutsuva rutiini 10.11.2015 – – – – – – – – – – – varaa tilaa paluuarvolle pinosta laita pparametrit ((arvot tai osoitteet)) ppinoon talleta vanha PC ja FP, aseta uudet PC ja FP varaa tilaa paikallisille muuttujille prolog t ll t käytettävien talleta kä t ttä i rekistereiden ki t id vanhat arvot pinoon (itse aliohjelman toteutus – varsinainen työ) palauta rekistereiden arvot vapauta paikallisten muuttujien tila epilog palauta l t PC ja j FP vapauta parametrien tila ota ppaluuarvo ppinosta Copyright 2015 Teemu Kerola Keskustele 15 Aktivointitietuepino muistissa • Aktivointitietueet (AT) varataan ja vapautetaan dynaamisesti (suoritusaikana) pinosta (muistista) – SP (=R6) osoittaa pinon pinnalle • Aktivointitietuepino X AT main – FP (R7) osoittaa i voimassa i olevan l AT:n sovittuun kohtaan ((ttk-91: vanhan FP:n osoite)) • Pinossa olevaa AT:tä rakennetaan ja puretaan käskyillä: – PUSH, POP, PUSHR, POPR – CALL, EXIT (SVC, IRET) Xsum AT sum FP Y AT funcA SP kasvava muistiosoite Talleta R0-R5 pinoon 10.11.2015 Copyright 2015 Teemu Kerola Keskustele 16 -- Loppu -M. Wilkes: M Wilk EDSAC (1949) • rekisterit (6 kpl), kpl) tyhjiöputkilla • käsky- ja d t datamuisti, i ti 32 elohopeaviiveputkea, kukin 32 kpl 18b sanaa (n. 2 Kb) • kertolasku 55.4ms, 4ms http://www.cl.cam.ac.uk/Relics/archive_photos.html h // l k/R li / hi h h l 650 IPS • ensimmäinen ”stored program” –tietokone • 3000 ttyhjiöputkea, hjiö tk sähkökulutus ähkök l t 12 kW kW, tila til 5x4m 5 4 10.11.2015 Copyright 2015 Teemu Kerola 17