Зрештою, бібліотечні функції Turbo С, звертаються до ISR BIOS або MS-DOS. В тих випадках, коли необхідно безпосереднє звернення до BIOS або MS-DOS, використовуються спеціальні функції, що описуються далі.
#include <dos.h>
int bdos( int dosfun, unsigned dosdx, unsigned dosal )
Виконує переривання 21h зі значеннями регістрів АН=dosfun, DX=dosdx, AL=dosal. Значення що повертається функцією ‑ значення регістру АХ, передане обробником переривання. Функція повертає значення регістру АХ на виході з переривання і використовується в тих випадках, коли вимагається звернення до функцій MS-DOS з наданням значень тільки регістрів АХ і DX.
#include <dos.h>
void geninterrupt( int intr_num )
Макрос, що виконує звернення, до обробника переривання з номером intr_num. Для завдання необхідних значень регістрам і отримання значення з обробника слід використати псевдозмінні. Перевагою макросу є мінімальний розмір і максимально можлива продуктивність коду при виконанні переривання. Недолік ‑ це можливість перепризначення при завантаженні регістрів раніше встановлених значень.
#include <dos.h>
int int86( int intno, union REGS *inregs, union REGS *outregs )
Функція завантажує внутрішні регістри мікропроцесора значеннями, записаними в об’єднанні по шаблону union REGS, на початок якого вказує inregs, і виконує переривання з номером intno. Значення внутрішніх регістрів на виході з переривання записуються в об’єднанні по шаблону union REGS, на початок якого вказує outregs. Опис об’єднань виконує точка виклику функції. Шаблон union REGS описаний в заголовочному файлі <dos.h> являє собою об’єднання двох структур:
struct WORDREGS {
unsigned int ax, bx, сx, dx, si, di, cflag, flags;
};
struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Структура WORDREGS використовується для доступу до регістрів як до двобайтовим одиницям. Структура BYTEREGS дозволяє здійснювати доступ до окремих байтів РЗП. Поле структури flags дозволяє перед викликом задати, а після виклику прочитати значення регістру прапорів. Багато функцій MS-DOS використовують прапор переносу для сигналізації про помилки в програмі ‑ обробнику переривання, в структурі WORDREGS спеціально виділене поле cflag для значення прапора переносу.
Всі функції int...() повертають значення регістру АХ на виході з ISR. Недоліком функції int86() є можливість доступу лише до обмеженого числа регістрів. При виконанні деяких функцій MS-DOS значення задаються і в сегментних регістрах. В таких (щоправда, достатньо рідких) випадках належить використати більш загальну функцію int86x():
#include <dos.h>
int int86x( int intno,
union REGS *inregs, union REGS
*outregs,
struct SREGS *segregs )
На відміну від int86() перед виконанням переривання intno додатково встановлюються сегментні регістри з структурної змінної по шаблону SREGS. В функцію передається покажчик на цю структурну змінну. По поверненні з ISR в структурну змінну по шаблону SREGS додатково копіюються значення всіх сегментних регістрів (про шаблон структури SREGS). Функції geninterrupt(), int86() і int86x() дозволяють виконати переривання з будь-яким номером. Якщо необхідно виконати звернення до функції MS-DOS (переривання 21h з заданим значенням АН), можна використати функцію intdos(), яка завжди звертається до переривання 21h.
#include <dos. h>
int intdos( union REGS *inregs, union REGS *outregs);
На відміну від раніше розглянутих функцій даній функції не передається номер переривання що генерується, бо завжди генерується переривання 21h.
#include <dos.h>
void intr (int intno, struct REGPACK *preg);
Функція завантажує внутрішні регістри мікропроцесора значеннями, записаними в області пам’яті, адресу якої задає покажчик preg, після цього генерує переривання intno. Значення внутрішніх регістрів на виході з обробника записуються в область пам’яті, на яку вказує preg. Структура REGPACK описана в файлі <dos.h>:
struct REGPACK {
unsigned r_ax, r_bx, r_cx, r_dx;
unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags;
Функція не має значення що повертається і тому працює трохи швидше раніше розглянутих функцій.
![]() |
![]() |
![]() |