Practicum Computerarchitectuur

Opleidingsonderdeel Computerarchitectuur
Practicum 3: de onderbrekingsroutine
Gegeven het programma keyboard.asm. Dit programma zal worden
geassembleerd en gelinkt tot een programma dat op de bootsector van een
floppy kan geschreven worden. Bij het opstarten van de PC gaat de controle over
naar dit programma en hebben we complete toegang tot alle onderdelen van de
processor (omdat we ons op dat ogenblik in kernelmode bevinden).
De bootsector bestaat uit de eerste sector van de floppy. Deze sector zal de
volgende sectoren inlezen en het bijhorende programma uitvoeren. Om als
bootsector herkend te worden, moet de eerste sector eindigen met het bitpatroon
55AA. De eerste sector van de floppy wordt door de BIOS automatisch geladen
op adres 7c00h. We laten de stapel vanaf adres 7c00h groeien naar adres 0 toe.
Stapel
7c00
Sector 0
Sector 1
Sector 2
Nadat alle sectoren ingeladen werden, wordt er omgeschakeld naar protected
mode en wordt er begonnen met de uitvoering van 32-bit code.
Dan wordt het hoofdprogramma uitgevoerd, dat bestaat uit het herhaald
volschrijven en terug wissen van het scherm. De routine die dit doet (spiraal) zit
vrij complex in elkaar en hoeft U niet volledig te begrijpen om het practicum te
kunnen uitvoeren. U merkt wel wat ze doet tijdens het uitvoeren van het
programma. Van belang is wel dat deze routine ongeveer alle beschikbare
registers voor algemeen gebruik zal gebruiken om te kunnen werken. Dit
betekent dat U in de onderbrekingsroutines alle gebruikte registers zal moeten
bewaren en herstellen.
Practicum 3 Computerarchitectuur
1
Om het practicum te kunnen uitvoeren beschikt U over de volgende bestanden:
keyboard.asm = het hierboven beschreven programma
k.bat = script dat keyboard.asm assembleert en omzet in MyBoot.bin
b.bat = script dat de bochs emulator opstart met het bestand MyBoot.bin
Voor dit practicum zullen we niet door de moeite gaan om de PC telkens te
herbooten vanaf floppy. We gebruiken in de plaats een Pentium-emulator
(bochs). In het configuratiebestand van bochs staat dat de inhoud van floppy A
opgeslagen ligt in MyBoot.bin. Op die manier zal hij dus booten van MyBoot.bin.
U editeert keyboard.asm (b.v. met notepad), en na bewaard te hebben voert U in
het dos-venster “k” uit om het programma te assembleren, en nadien “b” om het
in bochs uit te voeren.
Indien U echt een bootfloppy wenst te maken, dan kunt U dat doen door rawrite
uit te voeren. U kunt de PC dan van floppy booten. U kunt zich dan vergewissen
van het feit dat deze bootfloppy ook in het echt werkt.
Het bestand MyBoot.bin kunt U indien gewenst disassembleren met het
programma ndisasmw.exe. U moet dit wel in twee keer doen: met de vlag –b 16
voor de eerste sector en met de vlag –b 32 voor de overige sectoren.
Voorbereiding
Bestudeer de listing met assemblerinstructies (let op: hier wordt een variant van
de Intel-syntax gebruikt). Probeer zeker de code tot aan het gedeelte met
hulpfuncties door te nemen. Zaken die U niet begrijpt kan U vragen tijdens het
practicum zelf.
Het is daarenboven sterk aanbevolen om in de cursus het gedeelte over
onderbrekingen en vooral het bijhorend voorbeeld i.v.m. de printeronderbreking
grondig te bekijken.
Practicum 3 Computerarchitectuur
2
Opgaven
1. Installeer de toetsenbordhandler. Gebruik hiervoor de routine
install_handler. Ga na op welke manier U het nummer van de vector en
het adres van de handler moet meegeven. Op welk vectornummer moet
de toetsenbordhandler geïnstalleerd worden?
2. Pas het onderbrekingsmasker in poort 21h aan zodat de
toetsenbordonderbreking aangeschakeld wordt. Welke bit in het masker
moet hiervoor aangepast worden?
3. Voorlopig is de toetsenbordhandler leeg (op iret na). Zorg ervoor dat de
onderbrekingsregelaar te weten komt dat hij nieuwe onderbrekingen mag
doorsturen en zet de onderbrekingen nadien aan.
4. In poort 60h kan je de scancode van de ingedrukte toets ophalen. Schrijf
de ingelezen scancode op het scherm aan de hand van de routine
printscancode. Let erop dat de werking van het hoofdprogramma niet
verstoord wordt door het tonen van de scancode, m.a.w. zorg ervoor dat
de registers goed bewaard en hersteld worden (tip: gebruik pushad en
popad om de registers te bewaren en terug te herstellen).
5. Bekijk de waarden van de make en break codes voor een aantal toetsen
(make code = code bij het induwen van de toets, break code = code bij het
loslaten van de toets). Wat is de relatie tussen de make en break codes?
Hoe codeert men de shift toets? Hoe kan een onderscheid tussen kleine
letters en hoofdletters gemaakt worden?
6. Kunt U ervoor zorgen dat door het indrukken van de ‘r’-toets, naast het
tonen van de bijhorende scancode, ook de voornaamste registers getoond
worden (met call printad)? Let er opnieuw op dat de registers goed
bewaard en hersteld worden. Ga na op welke manier de uit te printen
registers moeten meegegeven worden voor printad. Zorg ervoor dat als
instructiewijzer het terugkeeradres van het hoofdprogramma getoond
wordt. Waar wordt deze op de stapel bewaard?
7. Wat merkt U als U het verloop van de instructiewijzer bekijkt (druk
hiervoor enige keren op de ‘r’-toets)? Disassembleer het programma
d.m.v. “ndisasmw –b 32 MyBoot.bin” om dit te verklaren. Hou er rekening
mee dat de code op adres 7c00h werd geladen.
Practicum 3 Computerarchitectuur
3
Facultatieve opgaven
8. Kunt U achterhalen hoeveel keer de timerhandler per seconde
opgeroepen wordt? Laat daarom de timerhandler om de x oproepen een
boodschap op het scherm zetten. Voor x voldoende groot moet je een
schatting kunnen maken van het aantal keer de handler opgeroepen wordt
per seconde.
9. Kunt U de timerhandler nu gebruiken om de waarde van de registers
automatisch 2x per seconde op het scherm te updaten? U kunt de ‘r’-toets
nu gebruiken om het actualiseren aan en af te zetten. Het
hoofdprogramma moet gedurende al deze operaties gewoon verder
blijven werken.
10. Zet het programma nu op een floppy, en probeer het uit op de echte
hardware. Wat is het meest opvallende verschil?
11. Disassembleer het programma MyBoot.bin met ndisasmw –b 16
MyBoot.bin voor de eerste sector en ndisasmw –b 32 MyBoot.bin voor de
overige sectoren. Herken je de signatuur van de bootsector?
Practicum 3 Computerarchitectuur
4