Real Mode Interrupts
Posted: Thu Dec 14, 2006 10:34 am
What can I do with int 31 in Protected Mode? I see this code in a program working in PM:
The rm_int function doesn't compile.
Code: Select all
/* register data for calling real mode interrupts (DPMI format) */
typedef union
{
struct {
unsigned long edi;
unsigned long esi;
unsigned long ebp;
unsigned long res;
unsigned long ebx;
unsigned long edx;
unsigned long ecx;
unsigned long eax;
} d;
struct {
unsigned short di, di_hi;
unsigned short si, si_hi;
unsigned short bp, bp_hi;
unsigned short res, res_hi;
unsigned short bx, bx_hi;
unsigned short dx, dx_hi;
unsigned short cx, cx_hi;
unsigned short ax, ax_hi;
unsigned short flags;
unsigned short es;
unsigned short ds;
unsigned short fs;
unsigned short gs;
unsigned short ip;
unsigned short cs;
unsigned short sp;
unsigned short ss;
} x;
struct {
unsigned char edi[4];
unsigned char esi[4];
unsigned char ebp[4];
unsigned char res[4];
unsigned char bl, bh, ebx_b2, ebx_b3;
unsigned char dl, dh, edx_b2, edx_b3;
unsigned char cl, ch, ecx_b2, ecx_b3;
unsigned char al, ah, eax_b2, eax_b3;
} h;
} RM_REGS;
void rm_int(int num, RM_REGS *regs)
{
regs->x.flags = 0;
regs->x.sp = 0;
regs->x.ss = 0;
asm (
" int $0x31 "
:
: "a" (0x300),
"b" (num),
"c" (0),
"D" (regs)
: "%eax",
"%ebx",
"%ecx",
"%edx",
"%esi",
"%edi"
);
}