idt klein und knapp, x86
-
ich möchte eine idt mit 256 einträgen erstellen und alle mit der gleichen funktion befüllen. die eine funktion soll also für jeden interrupt aufgerufen werden.
die funktion soll nun feststellen können, welcher interrupt ausgelöst wurde und entsprechend darauf reagieren. lässt sich das bewerkstelligen, ohne mit 256 funktionen/labels arbeiten zu müssen?
i0: push 0 jmp funcbody i1: push 1 jmp funcbody i2: push 2 jmp funcbody ...
gehts eleganter als so? kommt man irgendwie an die nummer des ausgelösten interrupts heran?
-
... Es gibt evtl. schon Mittel und Wege - zB. das Auslesen des letzten Befehls am gesicherten cs:eip. Sowas ist allerdings IMHO weder eleganter noch ist es sonderlich sicher.
-
Ich empfehle dir, deinen "WerkZeugKasten" zu erweitern und einen speziellen
PreProzessor hinzuzunehmen. Ich empfehle dir den m4 anzugucken.http://en.wikipedia.org/wiki/Preprocessor
http://en.wikipedia.org/wiki/M4_(computer_language)
http://www.gnu.org/software/m4/aus http://en.wikipedia.org/wiki/M4_(computer_language)
m4 offers these facilities:
* text replacement
* parameter substitution
* file inclusion
* string manipulation
* conditional evaluation
* arithmetic expressions
* system interface
* programmer diagnosticsDamit ist es möglich:
*eine PreProzessor-Variable IDX auf NULL zu setzen
*ein PreProzessor-Makro IDT_ENTRY zu schreiben, dass:
-IDX um 1 erhoeht
-IDX im Makro durch seinen Wert substituiert (label und den push)
-diesen Code plaziert
*den 256-fachen Aufruf des Makros in einer AnweisungIch schätze den dazu notwendigen Code auf kurze 6-7 Zeilen. Wenn du den Nutzen
des PreProzessors erkennst willst du ihn nicht mehr missen wollen!
Du musst lediglich den QuellCode erst durch den PreProzessor schicken und dann
durch den Compiler.#> m4.exe source.m4 > sorce.asm
#> masm.exe source.asm -o my.binWenn dir dieser LösungsVorschlag zu AUFWENDIG erscheint kann ich nur sagen:
Du willst LÖCHER bohren? Du brauchst eine BOHRMASCHINE! Immer wieder!Und wenn du dich in einen PreProcessor hineinarbeiten möchtest, nimm gleich den
besten denn er ist OpenSource!das ist jedenfalls mein rat
mfg gorgoyle