890 likes | 1.05k Views
SOCS. Hoofdstuk 3 Basisprogrammatuur. Inhoud. De Vertaler De Voorvertaler De Lader De absolute lader De relocerende lader Dynamische relocatie De Binder De Vertolker Het Speurprogramma Het Opstarten van de Computer. Lader. RAM. 1131000005 7299999999 2131000006 7299999999
E N D
SOCS Hoofdstuk 3 Basisprogrammatuur
Inhoud • De Vertaler • De Voorvertaler • De Lader • De absolute lader • De relocerende lader • Dynamische relocatie • De Binder • De Vertolker • Het Speurprogramma • Het Opstarten van de Computer
Lader RAM 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 Lader Uitvoerbaar programma(machinetaal)
Lader RAM 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 Lader
Lader nodig? Vertaler: rol van lader? Vertalen UitvoerenTelkens opnieuw! Tijd! | Vertaler | > | Lader |Minder geheugen beschikbaar Verantwoording RAM 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 HIA R0,A DRU OPT R0,B DRU STP A: 10000 B: 20000 Vertaler
Verantwoording RAM Vertalen ... ( x 1 ) 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 HIA R0,A DRU OPT R0,B DRU STP A: 10000 B: 20000 Vertaler Schijf
Verantwoording RAM 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 Uitvoeren ... ( x N ) 1131000005 7299999999 2131000006 7299999999 9999999999 0000010000 0000020000 Lader
Lader • Deel van het besturingssysteem • Zie ook opstarten van een computer • Verschillende Lader-algoritmes • Absolute Lader • Relocerende Lader • Extra Apparatuur • Dynamische adresvertaling
Absolute Lader • Uitvoerbaar programma ongewijzigd in geheugen • Meest elementaire geval • Programma steeds vanaf adres 0000 geladen • Programma in invoerorgaan • Eerste getal = lengte van het programma • Lader geladen vanaf adres 9000 0000000145 7299999999 … … symb.tabel … Lengte aanduiding 145 bevelen/constanten
Algoritme: Lengte inlezen Opeenvolgende getallen inlezen in opeenvolgende geheugenplaatsen wegbergen Start uitvoering int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } 7199999999 0000 1221000010 0001 0000000000 0002 0000000000 0003 adres 0000000000 0004 0000000000 0005 … Absolute Lader adres = 0; goto *adres;
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 Absolute Lader LEZ | lengte HIA R2,R0
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 Absolute Lader HIA.a R1,0
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 Absolute Lader LUS: VGL.w R2,0 VSP KLG,ewh
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,ewh Absolute Lader LEZ | Instr. BIG R0,0(R1+)
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,ewh LEZ | Instr. BIG R0,0(R1+) Absolute Lader AFT.w R2,1
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,ewh LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 Absolute Lader SPR LUS
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,ewh LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS Absolute Lader 0 | Start
int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR Absolute Lader
Simulator? Truukjes Zelf lengte aanduiding toevoegen Invoer uit bestand-invoer bestandsnaam | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR Absolute Lader OK?
Simulator? | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR 1224010000 7199999999 0006 0000 1122200000 2211200001 0001 0007 3121900003 1111100000 0002 0008 3311200000 1233456788 0009 0003 3221200000 4234242342 0010 0004 3453453533 7199999999 0005 0011 Absolute Lader 1224010000 2211200001 3121900003 7299999999 Lader overschrijft zichzelf !!!
Simulator? Truukjes Zelf lengte aanduiding toevoegen Invoer uit bestand-invoer bestandsnaam Lader vanaf 9000? | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR Absolute Lader
Simulator? Truukjes Zelf lengte aanduiding toevoegen Invoer uit bestand-invoer bestandsnaam Lader vanaf 9000! | Absolute lader LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR Absolute Lader SPR LADER RESGR 8999 LADER:
| Absolute lader SPR LADER RESGR 8999 LADER: LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr. BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR 7199999999 3121909000 0000 9000 1122200000 0000000000 0001 9001 0000000000 1111100000 0002 9002 3311200000 0000000000 9003 0003 0000000000 3221000000 9004 0004 7199999999 0000000000 9005 0005 1224010000 9006 2211200001 9007 3121909003 9008 Absolute Lader 1224010000 2211200001 3121900003 7299999999
≠ programma’s 1 na 1 inladen en uitvoeren Werkwijze: In elk programma:STP SPR 9000 Programma’s vertalen In elk vertaald progr: “Lengte” inlassen Symbooltabel weglaten Alle programma’s na elkaar in 1 bestand lengteA CodeA lengteB CodeB lengteC CodeC Eenvoudig besturingssysteem SPR 9000 CodeA CodeB RAM CodeC SPR 9000 VSP KLG,0 Lader
Absolute Lader • Verfijning • Programma NIET ALTIJD vanaf adres 0000 geladen • Meerdere programma’s in het geheugen! • Probleem • Adressen kloppen niet • Vertaler symbooltabel (PT = 0)
1131100004 0000 2111100001 0001 1221100005 0002 9999999999 0003 A B 0000000010 0004 0000000000 0005 1131100104 0100 2111100001 0101 1221100105 0102 9999999999 0103 A B 0000000010 0104 0000000000 0105 1131100304 0300 2111100001 0301 1221100305 0302 9999999999 0303 A B 0000000010 0304 0000000000 0305 Absolute Lader HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 … HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1
Absolute Lader • Lader kan programma niet wijzigen • Oplossing: • Vertaler moet correcte adressen genereren • Programmeur Vertaler: “Te laden vanaf XXX” • Vertaler-directiefLAADGR laadadres • Vertaler aanpassen: • Stap 1: PT Laadadres (i.p.v. 0) • Vertaler Lader: “Te laden vanaf XXX” • Stap 2: Lengte en Laadadres in uitvoerbaar programma Next
Stap 1 Lijnteller(LT = 1) Programmateller(PT = 0) Symbooltabel(ST = ) Lijn per lijn inlezen: Commentaarlijn: doe niets ? NAAM: (NAAM, PT) in ST Instructie? PT PT + 1 Constante(n)/RESGR n? PT PT + n Fout? *** fout *** lijn LT: … LT LT + 1 Aanpassing Vertaler Laadadres = 0 • LAADGR adres? • Laadadres = adres; PT = adres
Stap 1 Lijnteller(LT = 1) Programmateller(PT = 0) Symbooltabel(ST = ) Lijn per lijn inlezen: Commentaarlijn: doe niets ? NAAM: (NAAM, PT) in ST Instructie? PT PT + 1 Constante(n)/RESGR n? PT PT + n Fout? *** fout *** lijn LT: … LT LT + 1 Stap 2 Lijnteller(LT = 1) Symbooltabel(ingevuld in stap 1) Lijn per lijn inlezen: Commentaarlijn: doe niets Instructie? genereer code Constante(n) genereer constante(n) RESGR n? genereer n 0-constanten Fout? *** fout *** lijn LT: … LT LT + 1 Aanpassing Vertaler Schrijf lengte (= PT – laadadres) en Laadadres Laadadres = 0 • LAADGR adres? • Laadadres = adres; PT = adres
0000000006 Hoofding 0000000300 1131100304 2111100001 1221100305 Programma-code 9999999999 0000000010 0000000000 #symbolen Symbool-tabel A 0304 B 0305 Absolute Lader Lengte Laadadres LAADGR 300 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 Bronprogramma Uitvoerbaar programma
0000000006 0000000006 0000000006 0000000100 0000000300 0000000000 1131100104 1131100304 1131100004 2111100001 2111100001 2111100001 1221100105 … 1221100305 … 1221100005 … Absolute Lader HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 LAADGR 100 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 LAADGR 300 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 Vertaler Vertaler Vertaler
1131100004 0000 2111100001 0001 1221100005 0002 9999999999 0003 A B 0000000010 0004 0000000000 0005 1131100104 0100 2111100001 0101 1221100105 0102 9999999999 0103 A B 0000000010 0104 0000000006 0000000000 0105 0000000006 0000000006 1131100304 0300 0000000100 0000000300 0000000000 2111100001 0301 1131100104 1131100304 1221100305 1131100004 0302 2111100001 2111100001 9999999999 2111100001 0303 1221100105 … 1221100305 … A B 0000000010 0304 1221100005 … 0000000000 0305 Absolute Lader Lader
Algoritme Lengte inlezen Opeenvolgende getallen inlezen opeenvolgende geheugenplaatsen Start uitvoering int lengte, *adres; main() { lengte = getint(); adres = 0; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering op adres 0 */ } Absolute Lader , *laadadr; • Laadadres inlezen laadadr = (int *) getint(); adres = laadadr; (begin bij Laadadres) • Sprong Laadadres vanaf laadadr */ goto *laadadr;
int lengte, adres, instr, *laadadr; main() { lengte = getint(); laadadr = (int *) getint(); adres = laadadr; while (lengte > 0) { *adres++ = getint(); lengte--; } /* start uitvoering vanaf laadadr */ } | Absolute Lader | Lengte R2 | Adres R1 LEZ | Lengte HIA R2,R0 HIA.a R1,0 LUS: VGL.w R2,0 VSP KLG,0 | Start LEZ | Instr BIG R0,0(R1+) AFT.w R2,1 SPR LUS EINDPR Absolute Lader | Laadadres R3 LEZ | Laadadres HIA R3,R0 HIA R1,R3 (R3)
Relocerende Lader • Nadeel absolute lader: • Programmeur moet vóór vertalinglaadadres kennen • Vertaler Lader: “Hoe adressen aanpassen” • Relocatietabel • relatief adresbewerking
0000000006 0000000000 1131100004 2111100001 1221100005 0000 9999999999 0001 0000000010 0002 0003 0000000000 0004 #symbolen 0005 A 0004 B 0005 #relocatie 0000 +#LAADADRES# 0002 +#LAADADRES# Vertaler Relocerende Lader Lengte Laadadres 9999999999 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1
Vertaler Relocerende Lader HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 Vertaler (1ste stap):
PT LT 0 1 Vertaler Relocerende Lader Vertaler (2de stap): 1 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 0000 +#LAADADRES#
PT LT 1 2 Vertaler Relocerende Lader Vertaler (2de stap): 2 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 2111100001 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES#
PT LT 2 3 Vertaler Relocerende Lader Vertaler (2de stap): 3 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 2111100001 1221100005 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES# 0002 +#LAADADRES#
PT LT 3 4 Vertaler Relocerende Lader Vertaler (2de stap): 4 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 2111100001 1221100005 9999999999 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES# 0002 +#LAADADRES#
PT LT 4 5 Vertaler Relocerende Lader Vertaler (2de stap): 5 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 2111100001 1221100005 9999999999 0000000010 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES# 0002 +#LAADADRES#
PT LT 5 6 Vertaler Relocerende Lader Vertaler (2de stap): 6 HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 2111100001 1221100005 9999999999 0000000010 0000000000 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES# 0002 +#LAADADRES#
PT LT 6 6 Vertaler Relocerende Lader Vertaler (2de stap): HIA R1,A OPT.w R1,B-A BIG R1,B STP A: 10 B: RESGR 1 1131100004 2111100001 1221100005 9999999999 0000000010 0000000000 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES# 0002 +#LAADADRES#
0000000006 9999999999 1131100004 PT 6 2111100001 1221100005 9999999999 0000000010 0000000000 #symbolen A 0004 B 0005 #relocatie 0000 +#LAADADRES# 0002 +#LAADADRES# Vertaler Relocerende Lader 1131100004 2111100001 1221100005 9999999999 0000000010 0000000000 0000 +#LAADADRES# 0001 +#LAADADRES# 0001 -#LAADADRES# 0002 +#LAADADRES#
Relocerende Lader • Twee stappen: • Stap 1: • Uitvoerbaar programma letterlijk geheugen • Stap 2: Relocatie-stap: • Adressen aanpassen
0000000006 9999999999 1131100004 0300 1112323423 2111100001 1221100005 0000000000 0301 9999999999 5223241231 0302 0000000010 1231231231 0303 0000000000 4563453242 #symbolen 0304 A 0004 9231231231 0305 B 0005 #relocatie 0000 +#LAADADRES# 0002 +#LAADADRES# Relocerende Lader Laadadres = 0300 Stap 1 1131100004 2111100001 1221100005 9999999999 0000000010 0000000000
0000000006 9999999999 1131100004 0300 1131100004 2111100001 1221100005 2111100001 0301 9999999999 1221100005 0302 0000000010 9999999999 0303 0000000000 0000000010 #symbolen 0304 A 0004 0000000000 0305 B 0005 #relocatie 0000 +#LAADADRES# 0002 +#LAADADRES# Relocerende Lader Laadadres = 0300 Stap 2
0000000006 9999999999 1131100004 0300 1131100004 2111100001 1221100005 2111100001 0301 9999999999 1221100005 0302 0000000010 9999999999 0303 0000000000 0000000010 #symbolen 0304 A 0004 0000000000 0305 B 0005 #relocatie 0000 +#LAADADRES# 0002 +#LAADADRES# Relocerende Lader Laadadres = 0300 Stap 2 1131100304 0000+0300 = 0300 1131100004 + 0300 = 1131100304
0000000006 9999999999 1131100004 0300 1131100304 2111100001 1221100005 2111100001 0301 9999999999 1221100005 0302 0000000010 9999999999 0303 0000000000 0000000010 #symbolen 0304 A 0004 0000000000 0305 B 0005 #relocatie 0000 +#LAADADRES# 0002 +#LAADADRES# Relocerende Lader Laadadres = 0300 Stap 2 1221100305 0002+0300 = 0302 1221100005 + 0300 = 1221100305