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, ...).