Practicum Computerarchitectuur - UGent

advertisement
Opleidingsonderdeel Computerarchitectuur
Practicum 3: de onderbrekingsroutine
Gegeven het programma dat zich achteraan deze opgave bevindt. 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. 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. De eerste sector
moet eindigen met het bitpatroon 55AA om als bootsector herkend te worden.
Eenmaal in het hoofdprogramma moeten er 2 onderbrekingsroutines
geïnstalleerd worden:
1. de onderbrekingsroutine voor de timer
2. de onderbrekingsroutine voor het toetsenbord
Dan wordt het hoofdprogramma uitgevoerd, dat bestaat uit het herhaald
volschrijven en terug wissen van het scherm. De routine die dit doet zit vrij
Practicum 3 Computerarchitectuur
1
complex in elkaar en hoeft U niet te kunnen begrijpen om de rest van 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.
Om het practicum te kunnen uitvoeren moet U het bijhorende bestand
practicum3.zip unzippen in een tijdelijke directory. In dit bestand zitten de
volgende bestanden.
MyBoot.asm = het hierboven beschreven programma
c.bat = script dat MyBoot.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 MyBoot.asm (b.v. met notepad), en na bewaard te hebben voert U in
het dos-venster “c” 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.
Practicum 3 Computerarchitectuur
2
Opgaven
1. Bestudeer de listing met assemblerinstructies. Probeer zeker de code tot
en met de toetsenbordhandler te begrijpen. Zaken die je niet begrijpt kan
je vragen tijdens het practicum zelf (let op: hier wordt een variant van de
Intel-syntax gebruikt).
2. Installeer de toetsenbordhandler. Gebruik hiervoor de routine
install_handler. Ga na op welke manier je het nummer van de vector en
het adres van de handler moet meegeven. Op welk vectornummer moet
de toetsenbordhandler geïnstalleerd 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 gebruikt pushad en
popad om de registers te bewaren en terug te herstellen).
5. Bepaal de waarden van de make en break codes voor alle letters van het
alfabet (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?
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.
Practicum 3 Computerarchitectuur
3
Facultatieve opgaven
7. 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.
8. Kunt U de timerhandler nu gebruiken om de waarde van de registers
automatisch 2x per seconde op het scherm te updaten? U kunt de toets ‘r’
nu gebruiken om het actualiseren aan en af te zetten. Het
hoofdprogramma moet gedurende al deze operaties gewoon verder
blijven werken.
9. Zet het programma nu op een floppy, en probeer het uit op de echte
hardware. Wat is het meest opvallende verschil?
10. 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
Download