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