Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: sp am 06. December 2004, 19:00

Titel: GCC unter Interrupts
Beitrag von: sp am 06. December 2004, 19:00
Hallo

Kann man mit GCC Interrupt-Routinen direkt in C++ schreiben ohne einen kleinen ASM Code als Handel einzusetzten, der dann den C++ Code aufruft?

Mit Turbo C++ ging dies mittels "void interrupt foo()", gibt's sowas auch für GCC?

sp
Titel: GCC unter Interrupts
Beitrag von: elfish_rider am 18. July 2005, 18:52
Ich habe lange daran rumgebastelt und ich muss dir sagen, dass es fast nicht ohne ASM-Handler geht. GCC unterstützt keine solche Direktive. Auf Umwegen bringst dus vielleicht fertig, doch ein ASM-Handler ist viel einfacher.
Titel: GCC unter Interrupts
Beitrag von: Jidder am 18. July 2005, 19:32
ich mach das immer in C mit inline-Assembler:

void int0x01_stub (void);
asm(
".text\n"
".globl " EXT_ASM(int0x01_stub) "\n"
EXT_ASM(int0x01_stub) ":\n"
"pusha\n"
"call " EXT_ASM(int0x01_handler) "\n"
"popa\n"
"iret");


und der handler dann so:

void int0x01_handler()
{
/* dein handler code */
}


oder so:


struct regs {
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
};
void int0x01_handler(struct regs r, unsigned int eip, unsigned int cs, unsigned int eflags)
{
/* dein handler code */
}


mit dem letzteren kannst du lesend und schreibend auf die parameter im stack zugreifen. vielleicht ganz praktisch ...

EXT_ASM ist bei mir so deklariert
#define EXT_ASM(label) EXT_ASM2(label)
#define EXT_ASM2(label) "_" #label


das mache ich so, damit ich automatisch den Unterstrich ("_") vor dem funktionsnamen habe. natürlich nur auf win32/dos-plattformen. unter linux (und eigentlich jeder anderen plattform) muss das wahrscheinlich (!) so deklariert sein:
#define EXT_ASM(label) EXT_ASM2(label)
#define EXT_ASM2(label) #label


deine interrupt installationsroutine muss dann nur noch den handler (int0x01_stub) in die IDT eintragen.

das ist nur für C. ich glaube(!) für C++ musst du den Handler mit extern "C" deklarieren