was ist geninterrupt?



  • Hallo mal wieder,

    nach meinem bisherigen Wissensstand ging ich davon aus, dass Interrupts in einer Windows-Umgebung nicht möglich sind.
    Nun habe ich allerdings folgenden Code gefunden:

    #include <dos.h>
    
    int main ()
    {
        _AH = 0x0A;             /* Specify that we want service number 0Ah */
        _AL = '*';              /* (ASCII 42 dec = '*') */
        _BH = 0;                /* Screen page 0 */
        _CX = 10;               /* Repeat the character ten times */
        geninterrupt (0x10);    /* Call interrupt 10h. */
    
        return 0;
    }
    

    Wenn ich versuche dies auszuführen bekomme ich jedoch 5 Compilerfehler.
    Dies liegt wohl auch daran, dass weder in der dos.h selbst, noch in der darin includierten crtdefs.h eine solche Funktion deklariert ist.

    Meine Fragen dazu:
    1. Lohnt es sich damit zu beschäftigen oder ist es weitestgehend unnütz?
    2. Falls es sich lonht: Wie funktioniert das? sind _AH, _AL (usw.) globale Variablen die die Register Inhalte repräsentieren sollen?

    Schon mal danke im voraus.



  • Hallo FrEEzE2046,

    Das eine <dos.h> in einer Windows-Umgebung wenig Sinn macht sollte IMHO einleuchten.

    So weit ich weis kann man auf ein paar wenige Dinge unter Windows noch per INT 0x?? zugreifen (so wie der INT 0x80 unter Linux auch nur elementares anbietet). Das funktioniert aber nicht immer und spätestens unter einem 64Bit Windows dürfte damit Schluss sein. OS-Funktionen per INT aufrufen war unter DOS noch Up-To-Date aber heute gibt es dafür einen extra Syscall-Befehl (denn meines Wissens kein OS auf x86 unterstützt (sicherlich auch weil von AMD und Intel leicht unterschiedlich implementiert), auf anderen Plattformen ist das aber ein gebräuchlicher Weg) oder dynamisches Linken und direktes Aufrufen der gewünschten OS-Funktion, obwohl mir da jetzt auch nicht genau einfällt wie damit der Wechsel von Ring 3 nach Ring 0 gehen soll.

    sind _AH, _AL (usw.) globale Variablen die die Register Inhalte repräsentieren sollen?

    Nein. Beschäftige Dich mit Inline-Assembler.

    Was möchtest Du eigentlich erreichen??

    Grüße
    Erik



  • erik.vikinger schrieb:

    Was möchtest Du eigentlich erreichen??

    Ich glaube du hast mich falsch verstanden. Ich bin nur rein zufällig auf diesen Code gestoßen und ich habe mich gefragt, was genau dort gemacht wird.

    Du hast meine Frage also beantwortet, danke 😉





  • Ich will dafür keinen neuen Thread erstellen, aber:

    Gibt es eigentlich irgendwo eine Übersicht welcher Befehl wie viele Takte benötigt? Mich würde mal interessieren wie schnell einige Rechnungen im Vergleich zu einander sind.

    Beispielsweiße ob man eine Division durch 2 macht oder einen shr. Was ist schneller?



  • Hallo,

    Gibt es eigentlich irgendwo eine Übersicht welcher Befehl wie viele Takte benötigt?

    Vielleicht, aber das ändert sich schon innerhalb der aktuellen Prozessor-Generationen teilweise erheblich. Dazu kommt das die Ausführungszeit eines Befehls von sehr vielen Faktoren abhängig ist, z.B. sind die Ausgangsdaten vorhanden, ist das benötigte Rechenwerk verfügbar, ist der Befehl schon decodiert oder gibt es Abhängigkeiten bei den Flags usw. Hyper-Threading u.ä.machen die Sache noch deutlich komplexer.

    Beispielsweiße ob man eine Division durch 2 macht oder einen shr. Was ist schneller?

    Nimm den SHR. Eine Division kann zwar auch sehr schnell sein aber die benötigt auf x86 bestimmte Register (die erst frei geräumt werden müssen) und der Divisor muss als Wert, mit einem zusätzlichen Befehl, in ein weiteres Register geladen werden (es gibt keine Division mit einen Immed-Wert als Divisor) beim SHR kann der Shift-Wert, ist ja nur 5 Bit, direkt im Befehl untergebracht werden (ob das auf den 6Bit-Wert im 64Bit-Modus auch zutrifft weis ich nicht genau aber ich denke schon). Der SHR-Befehl kostet auf jeden Fall weniger Code-Bytes, ist flexibler bei den verwendeten Registern und ist (IMHO) nie langsamer als die Division. Alle ernst zunehmenden Compiler bevorzugen SHR bei Divisionen mit 2er-Potenzen.

    Grüße
    Erik



  • Danke für deine Antwort.

    Es geht mir eigentlich auch nicht um die einzelnen Takte, sondern eher um einen groben Vergleich. Damit man einen Überblick hat, wie man einen Befehl effizienter umsetzen kann.



  • FrEEzE2046 schrieb:

    Meine Fragen dazu:
    1. Lohnt es sich damit zu beschäftigen oder ist es weitestgehend unnütz?
    2. Falls es sich lonht: Wie funktioniert das? sind _AH, _AL (usw.) globale Variablen die die Register Inhalte repräsentieren sollen?

    Schon mal danke im voraus.

    Auf jeden Fall lonhtt es sich, sich damit zu beschäftigen 😉


Log in to reply