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