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
© Copyright 2025 ExpyDoc