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