Volanie prerušení


<= =>

Pre volanie prerušení poskytuje Borland C++ množstvo funkcií

Makro geninterrupt()

Prototyp:
     void geninterrupt(int cislo_intr);

Použitie tohoto makra je najjednoduchší spôsob, využívajú sa len registrové pseudopremenné _BX, ...
Umožňuje vyvolať akékoľvek prerušenie, ale po návrate z prerušenia je nutné si uvedomiť, že všetky registre môžu mať nedefinované hodnoty (môžu byť prepísané).

Funkcia int86()

Prototyp:
    int int86(int intno, union REGS *inregs, union REGS *outregs);

Používa sa vtedy, keď potrebujeme vyvolať ľubovoľné prerušenie a potrebujeme bezpečne uchovať návratové hodnoty registrov.
Často sa používa ten istý parameter pre inregs aj outregs.

Funkcia int86x()

Prototyp:
    int int86x(int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs);

Má podobné použitie ako int86(), s tým rozdielom, že umožňuje odovzdať i prebrať hodnoty segmentových registrov cez parameter segers.

Funkcia intr()

Prototyp:
    void intr(int intno, struct REGPACK *p_reg);

Ak potrebujeme do prerušenia odovzdať kombináciu všeobecných a segmentových registrov, je možné použiť aj túto funkciu, používajúcu štruktúru REGPACK.

Funkcia intdos()

Prototyp:
    int intdos(union REGS *inregs, union REGS *outregs);

V porovnaní z predchádzajúcimi funkciami, ktoré umožňovali volať akékoľvek prerušenie, táto funkcia slúži len na volanie služieb DOSu (prerušenie 21h).
Pracuje úplne rovnako ako funkcia int86(), ale má o jeden parameter menej (číslo prerušenia).

Funkcia intdosx()

Prototyp :
    int intdosx(union REGS *inregs, union REGS *outregs, struct SREGS *segregs);

Táto funkcia je rozšírením funkcie intdos() o segmentové registre, podobne ako funkcia int86x() bola rozšírením funkcie int86().

Dátové typy pre prácu s registrami v Borland C++

Registrové pseudopremenné

_AL
_AH
_AX
_DI

_CS
_BL
_BH
_BX
_SI

_DS
_CL
_CH
_CX
_BP

_ES
_DL
_DH
_DX
_SP
_FLAGS
_SS


Zápisom do registrovej pseudopremennej sa zapisuje priamo do registrov procesora a naopak čítaním z nich sa číta priamo z registrov procesora.

Treba si však uvedomiť, že v programe sa skutočné registre využívajú nielen pre tieto premenné, ale aj pre všetky ďalšie účely. Z toho vyplýva, že nemožno s istotou očakávať, že register naplnený pomocou pseudopremennej bude mať v okamžiku použitia túto hodnou.

Okrem týchto pseudopremenných možno použiť pre nastavenie registrov i nižšie uvedené dátové typy, ktoré sa používajú predovšetkým pri volaní služieb MS-DOSu pomocou funkcií intdos(), int86(), intdosx(), int86x() a intr().

Priradenie do premennej niektorého z ďalej uvedených typov ešte neznamená, že sa táto hodnota ocitne v konkrétnom registri procesora. Toto priradenie do registrov sa prevedie až pri volaní príslušnej funkcie, ktorej parametrom je táto premenná.

Union REGS

Premenné tohoto typu slúžia na odovzdávanie registrov do a z funkcií intdos(), int86(), intdosx() a int86x().
  union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
je zložený z nasledujúcich štruktúr :

Štruktúra BYTEREGS pre prístup k bajtovým registrom
  struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
Štruktúra WORDREGS pre prístup k dvojbajtovým registrom
  struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};

Štruktúra SREGS

Táto štruktúra slúži na odovzdávanie segmentových registrov do alebo z funkcií intdosx(), int86x().
  struct SREGS {
unsigned int es, cs, ss, ds;
};
Pre zistenie aktuálneho stavu segmentových registrov môžete použiť funkciu :
void segread (struct SREGS *segp);

Segmentové registre sa používajú najmä na uchovávanie adries. Na tento účel sú určené makrá FP_OFF() a FP_SEG(), ktoré slúžia na získanie adresy offsetu a segmentu danej premennej.

Štruktúra REGPACK

Táto štruktúra obsahuje súhrn najpoužívanejších registrov, a to všeobecných aj segmentových. Používa sa vo funkcii intr().
  struct REGPACK {
unsigned int r_ax, r_bx, r_cx, r_dx;
unsigned int r_bp, r_si, r_di;
unsigned int r_ds, r_es, r_flags;
}
Nevýhodou tejto štruktúry je, že nedokáže priamo pracovať s 8 bitovými registrami (ah, al, bh, ...).


<= =>