
- •Программирование прерываний Механизм прерываний
- •Void (* interrupt_table[256])();
- •Вызов прерываний из программ
- •Int intdos (union regs *inregs,
- •Int intdosx (union regs *inregs,
- •Архітектура центрального процесора
- •Intel8086/88
- •01.12Регістри загального призначення
- •Регістр ознак стану процесора (регістр флагів)
- •Int SetSvgaMode (int iVMode)
- •Int86 (0x10, &inregs, &outregs);
- •Int 10h ; прерывание для работы с ; видеосистемой.
- •Изменение таблицы векторов прерываний
- •Void interrupt far int_funct(void)
- •Void (_interrupt _far *oldvect)(void);
- •Void _interrupt _far timer(void)
Вызов прерываний из программ
В языке Си есть 4 основных функции для вызова прерываний:
int86 – выполняет прерывания процессоров i80x86 (и старших моделей);
int86x – выполняет прерывания процессоров i80x86 с указанием значения сегментного регистра;
intdos – выполняет прерывание MS-DOS INT21h;
intdosx – выполняет прерывание MS-DOS INT21h с указанием значения сегментного регистра.
#include <DOS.H> // Для работы с
// прерываниями требуется
// заголовочный файл dos.h.
int int86 (int intno,
union REGS *inregs,
union REGS *outregs);
int int86x (int intno,
union REGS *inregs,
union REGS *outregs,
struct SREGS *segregs);
здесь intno – номер прерывания,
union REGS *inregs,
union REGS *outregs
– указатели на объединения (союзы); inregs позволяет заносить значения в регистры, outregs – получать возвращаемые в регистрах значения после выполнения прерывания.
union REGS
{
struct WORDREGS x;
struct BYTEREGS h;
};
где
struct WORDREGS // двухбайтовые
// регистры
{
unsigned int ax;
unsigned int bx;
unsigned int cx;
unsigned int dx;
unsigned int si;
unsigned int di;
unsigned int cflag;
};
struct BYTEREGS // однобайтовые
// регистры
{
unsigned char al, ah;
unsigned char bl, bh;
unsigned char cl, ch;
unsigned char dl, dh;
};
struct SREGS // сегментные регистры
{
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
Многочисленные функции прерывания INT21h выполняются с помощью функций Си:
Int intdos (union regs *inregs,
union REGS *outregs);
Int intdosx (union regs *inregs,
union REGS *outregs,
struct SREGS *segregs);
Все 4 функции Си возвращают данные, которые остаются после их выполнения в регистре AX.
Архітектура центрального процесора
Intel8086/88
01.12Регістри загального призначення
15 8 7 0
-
AX
AH
AL
(Аккумулятор)
BX
BH
BL
(База)
CX
CH
CL
(Лічильник)
DX
DH
DL
(Дані)
Регістри сегментів
CS
Регістр сегмента коду
DS
Регістр сегмента даних
SS
Регістр сегмента стека
ES
Рег. додаткового сегмента
Регістри зсуву
IP
Покажчик команд
SP
Покажчик стека
BP
Покажчик бази
SI
Індекс джерела
DI
Індекс призначення