Stýrikerfi I
09.12.41
Lokapróf 13. desember 1995
Leyfileg hjálpargögn: Kennslubækur og fyrirlestranótur
1. [10%] Búa á til 2 GB harðan disk með 20 plötum (skrifað á allar
hliðar) þar sem hægt er að lesa allt að 154KB á msek. við bestu aðstæður.
Ef gert er ráð fyrir að geirarnir séu 70 og að hver þeirra geymi 512 bæti,
lýsið þá öðrum eiginleikum disksins (snúningshraða, fjölda spora) og
áætlið leitartíma (access time) disksins.
2. [15%] Segjum að þið eigið að hanna reiknieiningu fyrir IEEE fleytitölur.
Eitt af markmiðunum er að engir aukastafir (aukabitar er líklega réttara
orð) tapist við reikniaðgerðir. Ef unnið er með 64-bita fleytitölur hve
stór þurfa gistun þá að vera til að hægt sé að geyma í þeim niðurstöður
aðgerðanna + eða * með fullri nákvæmni? En ef gjörvinn vinnur eingöngu
með 32-bita fleytitölur?
Athugið að þið þurfið í raun að hanna nýjar gerðir fleytitalna með
meiri bitafjölda og annari skiptingu milli svæða en einföld nákvæmni
(32 bitar) og tvöföld nákvæmni (64 bitar). Einnig þurfið þið að réttlæta
að þær gerðir geti geymt niðurstöður aðgerðanna í fullri nákvæmni og
noti til þess lágmarksfjölda bita.
3. [10%] Í 8086 smalamálinu er skipunin xlat. Hún yfirleitt
notuð til að ná í gildi úr töflu. Skipunin býst við að DS:BX bendi á
töfluna og að AL innihaldi vísi (index) inn í töfluna. Eftir framkvæmd
xlat inniheldur AL gildið sem er í töflunni. Ástæðan fyrir
nafninu xlat er að það má ímynda sér að skipunin varpi
(translate) gildinu í AL yfir í nýtt gildi.
Ein möguleg notkun á töflu er til að reikna heiltölu-kvaðratrót fyrir
gildi á bilinu 0 til 255.
- a)
- Sýnið hvernig hægt er að leysa það vandamál með xlat
skipuninni.
- b)
- Leysið sama vandamál án notkunar á xlat.
Þið þurfið ekki að búa til alla töfluna, sýnið bara fyrstu gildin í henni.
4. [20%] Hér að neðan er C++ kódi fyrir fall sem leitar með
helmingunarleit að gildinu x í vektornum f. Fallið er skrifað
endurkvæmt, sem er líklega ekki hraðvirkasta útgáfan, en er stutt og
einföld. Skrifið eins fall í 8086-smalamáli. Það verður að vera
endurkvæmt og kallanlegt úr Borland C++ (þ.e., verður að meðhöndla
staflaramma rétt).
// Notkun: k = leita(f, i, j, x);
// Fyrir: f[i..j-1] er svæði í f, sem raðað er í vaxandi röð
// Eftir: i <= k <= j, f[i..k-1] < x <= f[k..j-1]
int leita( int f, int i, int j int x ) {
if( j-i < 1 ) return i;
int m = (i+j)/2;
if( f[m] < x )
return leita(f, m+1, j, x);
else
return leita(f, i, m, x);
}
5. [10%] Gjörvi nokkur hefur 6 þrepa pípun og 2 biðhólf (þ.e., næstu
tvær skipanir á eftir hopp-skipun framkvæmast alltaf). Hér að neðan
er forritsbútur fyrir þennan gjörva. Hvaða gildi hefur b í lokin? Ef
þið þurfið að gefa ykkur einhverjar forsendur um hegðun pípunnar
takið þær þá skýrt fram.
load b, 0
load a, 1
cmpb, > b, 0, yfir ; ef b > 0 þá hoppa í yfir
cmpb, <> a, b, ut ; ef a <> b þá hoppa í ut
yfir inc b ; hækka b um 1
add b, 2 ; hækka b um 2
utdec b ; lækka b um 1
6. [10%] Hugmyndir um hvernig hægt sé að auka hraða á örgjörvum nýta sér
oft eiginleika sem aðeins tilteknar gerðir forrita hafa. Hinn aukni
hraði myndi þá aðallega koma fram í þess konar forritum. Hvernig á að
ákveða hvort framkvæma eigi breytinguna á gjörvanum? Hvaða
þættir koma þar við sögu? Er hægt að meta þá af einhverri nákvæmni?
7. [15%] Skrifið fallið hér að neðan sem PA-RISC smalamálsfall, sem fær
inn tvö gildi í %arg0 og %arg1 og skilar margfeldi
þeirra í %ret0.
// Notkun: k = margf(i, j);
// Fyrir: i og j eru heiltölur ³ 0
// Eftir: k er i*j
int margf( int i, int j ) {
int m = 0;
while( i!=0 ) {
if( i%2 == 1 ) m = m+j;
j = 2*j;
i = i/2;
}
return m;
}
8. [10%] Gefið er að Pentium örgjörvinn hefur tvö 8KB innri skyndiminni
(skipana og gagna) sem bæði eru með tvær línur í mengi og að línustærðin
er 32 bæti. Vistföng í Pentium eru 32 bitar.
- a)
- Lýsið þessum skyndiminnum aðeins nánar (skiptingu vistfangs,
o.fl.)
- b)
- Sýnið forrit (í Pascal, C, eða sauðakóda) sem nýtir sér
upplýsingarnar um gerð skyndiminnisins til að hægja á gjörvanum
(þ.e., klekkja á skyndiminninu!)