2016-05-19 8 views
2

Ich versuche, einige Interrupts aus dem geschützten Modus in C++ aufzurufen, indem ich zurück in den Real-Modus gehe, den Interrupt aufruft und in den geschützten Modus zurückschalte. Ich erhalte einen Fehler:Interrupts mit einem Register aufrufen

Ich versuche, dies zu beheben, aber ich weiß nicht, wo ich anfangen soll. Hier ist ein Auszug aus meinem Code:

void intupt(char intr) //Call interrupt function. INTR is number of interrupt. 
{ 
    pm2rm(); //Protected Mode To Real Mode 
    __asm 
    { 
     mov al, [intr] //Put intr to AL register 
     int al // call interrupt using AL 
    } 
    rm2pm(); //Real Mode to Protected Mode 
} 

Warum bekomme ich diesen Fehler? Irgendwelche Vorschläge, warum das passiert?

+2

Um einen Real-Mode-Interrupt aufzurufen, drücken Sie einfach die Flags und führen Sie einen Fernaufruf über die Interrupt-Vektortabelle durch. – Jester

+0

Welchen Compiler benutzen Sie? Was macht der Code in 'pm2rm()'? Lädt es das CS-Register mit einem geeigneten Real-Mode-Segmentwert neu? Oder löscht es nur das PE-Bit in CR0? –

Antwort

4

int nimmt nie ein Register als Operand, nur ein Byte-Literal. Wenn Sie den Interrupt zum Anrufen in einem Register angeben möchten, müssen Sie eine Versandtabelle verwenden.

+0

Was ist Versandtabelle? – Banananut

+1

@ASD klingt wie eine wirklich gute Frage, und könnte ein bisschen groß sein, um in Kommentaren richtig abzudecken. Wenn Sie mit einer Websuche keine gute Antwort finden, empfehle ich Ihnen, eine neue Frage zu stellen. Quoten sind gut, jemand hier kann eine gute Antwort geben, die für Ihr Programm relevant ist. – user4581301

+0

@ASD: Wie eine C 'switch' Anweisung, mit einem' case' für 'int 0x1', einem anderen für' int0x2', usw. [Google würde dir das sagen] (https://en.wikipedia.org/ wiki/Dispatch_table), wenn Sie überhaupt erst einen Computer fragen wollten. –