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 diagnostics

    Damit 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 Anweisung

    Ich 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.bin

    Wenn 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


Anmelden zum Antworten