Wie Schlüsselwort "interrupt" ersetzen / umgehen



  • Das reservierte Wort “interrupt“ muß ich irgendwie ersetzen, weil ich es nicht in meinen Device-Treiber gelinkt bekomme. Weiß nicht, was “interrupt“ macht (wer weiß mehr?),
    habe aber dazu mein void far interrupt newint(){ ...} durch

    void newint(void)
    {
    asm pushf
    asm push ax
    asm push bx
    asm push cx
    asm push dx
    asm push es
    asm push ds
    asm push si
    asm push di
    asm push bp
    ....
    asm pop bp
    asm pop di
    asm pop si
    asm pop ds
    asm pop es
    asm pop dx
    asm pop cx
    asm pop bx
    asm pop ax
    asm popf
    // asm iret
    }

    ersetzt, aber es gibt nur Abstürze; erst Recht, wenn ich noch den Kommentar beim iret entferne.

    Wer weiß also, wie ich meine Interruptfuktion umgestalten muß, damit sie ohne “interrupt“ auskommt???



  • ich bin nicht sicher, aber interrupt war auf dem borland3.1 fein. und du bust jetzt zum ms-compiler umgestiegen? könnte sein, daß du da declspec(__naked) machen mußt und das iret wirder dazunehmen.



  • btw:
    schau dir mal popa an



  • @volkard:

    volkard schrieb:

    ich bin nicht sicher, aber interrupt war auf dem borland3.1 fein. und du bust jetzt zum ms-compiler umgestiegen? könnte sein, daß du da declspec(__naked) machen mußt und das iret wirder dazunehmen.

    Nein, ich verwende schon Borland, schreibe aber einen Device-Treiber, so daß ich
    BCC und Turbo Link verwenden muß und der Linker sagt bei interrupt:
    “Error: Undefined symbol DGROUP@ in module mydevice.c“

    @ light:

    light schrieb:

    schau dir mal popa an

    Wer oder was soll popa sein?



  • user4711 schrieb:

    Wer oder was soll popa sein?

    gemeint ist

    asm popa
    


  • user4711 schrieb:

    BCC und Turbo Link verwenden muß und der Linker sagt bei interrupt:
    “Error: Undefined symbol DGROUP@ in module mydevice.c“

    komisch. das schlüsselwort interrupt hat gar nix mit dem linker zu schaffen.



  • volkard schrieb:

    user4711 schrieb:

    BCC und Turbo Link verwenden muß und der Linker sagt bei interrupt:
    “Error: Undefined symbol DGROUP@ in module mydevice.c“

    komisch. das schlüsselwort interrupt hat gar nix mit dem linker zu schaffen.

    Hmmm... vermutlich nicht direkt, aber vielleicht macht es irgendwie Probleme mit den Segmenten (in manchen asm-Programmen finde ich dazu auch imnmer nach push bp noch mov bp,DGROUP und mov ds,bp...).

    Aber egal - es müßte ja auch irgendwie ohne "interrupt" gehen. Aber wie...?



  • user4711 schrieb:

    Aber egal - es müßte ja auch irgendwie ohne "interrupt" gehen. Aber wie...?

    sehe ich das richtig, daß die adresse fraglichgen funktion dann in einen interruptvector eingetragen werden soll? dann sollte dir funktion keinen normalen funkionsprolog haben. und genau den schaltete du mit interrupt aus. kannst auch ne normale funktioon nehmen, und hinter den prolog springen und vor dem epilog mit rti raus. aber das wird wackelig.
    das abschalten des prologs/epilogs macht keinen linkerfehler.
    aber vielleicht will der compiler die ganze funktion in ein segment namens DGROUP stopfen, sobald sie interrupt ist? wäre eigentlich quatsch, aber wer weiß. kannste ein segment namens DGROUP anbieten? oder kannste dir funktion in ein anderes segment kriegen? oder kannste nach tiny umschalten in der hoffnung, daß der compiler da auf segmente verzichtet?



  • Muß ehrlich gestehen, daß ich so gut wie gar kein Assembler kann und selbst in C kein Profi bin.

    Compiliert wird der Devicetreiber mit bcc -c -mt -k- -rd mydevice.c und gelinkt mit
    tlink -t -c mydevice.com mydevice.sys

    In den Aseemblerdirektiven geht
    asm CSEG segment para public 'CODE' oder
    asm assume CS:CSEG,DS:CSEG
    natürlich nicht (Weiß aber auch nicht, wo ich wie konkret den Prolog und Epilog überspringen müßte).

    Hab‘ mal irgendwo
    typedef void DUMMY;
    DUMMY f_kt(DUMMY)
    {
    asm push ax; usw.
    .....
    asm pop ax; usw.
    }
    gelesen, aber das klappt genau so wenig (Abstürze; auch mit asm iret). (Das Speichermodell ist übrigens eh tiny und der Treiber sehr klein).

    Da mein void far interrupt newint(){ ...} aber auch in einem normalen Programm mit main() funktioniert und den DOS-Interrupt gut ersetzt, würde ich mich am meisten über eine “void newint(void){...?...}“ im Quelltext hier freuen, die das “interrupt“ nicht braucht (vielleicht liest ja doch noch jemand den Thread hier, der so etwas schon einmal probiert hat).

    Eigentlich dachte ich, daß das Pushen und Popen wie ganz oben im Thread (plus iret) reichen mußte, um eine Interrupt-Funktion ohne „interrupt“ zu schreiben, die man dann ohne Probleme in die Interruptvektortabelle eintragen kann...



  • Versuch mal, die interrupt-Routine auch far zu markieren.



  • Bashar schrieb:

    Versuch mal, die interrupt-Routine auch far zu markieren.

    Führt far genau so zum Anbsturz 😞


Anmelden zum Antworten