C Language and Libraries Help (clang.hlp) (
Table of Contents;
Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software,
purely for historical purposes.
If you're looking for up-to-date documentation, particularly for programming,
you should not rely on the information found here, as it will be woefully
out of date.
Interrupt Handler Parameters
◄Up► ◄Contents► ◄Index► ◄Back►
─────C/C++ Language─────────────────────────────────────────────────────────
On entry to an interrupt handler, the DS register is initialized
to the near data segment, allowing your interrupt handler to
access global variables.
In addition, all registers (except SS) are saved on the stack. You
can access these registers within the function if you declare a
function parameter list containing a formal parameter for each
saved register. For example:
void __interrupt __far int_handler( unsigned _es, unsigned _ds,
unsigned _di, unsigned _si,
unsigned _bp, unsigned _sp,
unsigned _bx, unsigned _dx,
unsigned _cx, unsigned _ax,
unsigned _ip, unsigned _cs,
unsigned flags )
{
∙ ∙ ∙
}
You can omit parameters from the end of the list in your
declaration, but you cannot omit parameters from the beginning of
the list. For example, if your handler needs to use only DI and
SI, you must still provide the ES and DS arguments, but not
necessarily BX, DX, or those that follow.
The compiler always saves and restores registers in the same
fixed order. Thus, no matter what names you use in the formal
parameter list, the first parameter in the list refers to ES, the
second refers to DS, and so on.
Do not give your parameters actual register names because they
can conflict with the inline assembler. To prevent conflict and
retain the documentation of the register names, use an underscore
when naming your parameters (for example, _ax, _bx).
Passing Additional Arguments
You can pass additional arguments if your interrupt handler is to
be called directly from C or C++ rather than by an INT instruction.
To do this, you must declare all register parameters and then
declare your parameter at the end of the list.
Changing Parameters
If you change any parameters of an interrupt handler during
function execution, the corresponding register contains the
changed value when the function returns. The code below causes DI
to contain -1 when int_handler returns.
void __interrupt __far int_handler( unsigned _es, unsigned _ds,
unsigned _di, unsigned _si)
{
_di = -1;
}
Do not modify the values of IP or CS in an interrupt handler. If
you need to modify a flag, use the bitwise-OR operator (|) so
that the other flags are not changed.
-♦-