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(){ ...} durchvoid 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 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.sysIn 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