interrupt the CPU
#include <i86.h> int int386x( int inter_no, const union REGS *in_regs, union REGS *out_regs, struct SREGS *seg_regs );
The int386x() function causes the computer's central processor (CPU) to be interrupted with an interrupt whose number is given by inter_no. This function is present in the 32-bit C libraries, and may be executed on Intel 386 compatible systems. Before the interrupt, the CPU registers are loaded from the structure located by in_regs, and the DS, ES, FS and GS segment registers are loaded from the structure located by seg_regs.
All of the segment registers must contain valid values. Failure to do so will cause a segment violation when running in protect mode. If you don't care about a particular segment register, then it can be set to 0, which will not cause a segment violation. The function segread() can be used to initialize seg_regs to their current values.
Following the interrupt, the structure located by out_regs is filled with the contents of the CPU registers. The in_regs and out_regs structures may be located at the same location in memory. The original values of the DS, ES, FS and GS registers are restored. The structure seg_regs is updated with the values of the segment registers following the interrupt.
the value of the CPU EAX register after the interrupt
int386(), int86(), int86x(), intr(), segread()
#include <stdio.h> #include <i86.h> /* get current mouse interrupt handler address */ void main() { union REGS r; struct SREGS s; s.ds = s.es = s.fs = s.gs = FP_SEG( &s ); #if defined(__PHARLAP__) r.w.ax = 0x2503; /* get real-mode vector */ r.h.cl = 0x33; /* interrupt vector 0x33 */ int386( 0x21, &r, &r ); printf( "mouse handler real-mode address=" "%lx\n", r.x.ebx ); r.w.ax = 0x2502; /* get protected-mode vector */ r.h.cl = 0x33; /* interrupt vector 0x33 */ int386x( 0x21, &r, &r, &s ); printf( "mouse handler protected-mode address=" "%x:%lx\n", s.es, r.x.ebx ); #else r.h.ah = 0x35; /* get vector */ r.h.al = 0x33; /* vector 0x33 */ int386x( 0x21, &r, &r, &s ); printf( "mouse handler protected-mode address=" "%x:%lx\n", s.es, r.x.ebx ); #endif }
Intel
DOS/32, QNX/32, Netware