Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Функции работы с портами машины

1. Считывание байта из порта. Прототипы функций:

unsigned char inportb(int port);

int inp(int port);

где port - адрес порта ввода-вывода.

2. Считывание слова из входного порта. Прототип функции:

int inport(int port);

3. Запись байта в порт. Прототипы функций:

void outportb(int port, unsigned char byte);

int out(int port, int byte_value);

4. Запись слова в выходной порт. Прототип функции:

void outport(int port, int word);

Интерфейс с дос

Эта группа функций позволяет вызывать стандартные функции ДОС, не включенные в другие группы функций.

1. Общий интерфейс программных прерываний процессора 8086. Прототипы функций:

int int86(int intr_num, union REGS *inregs, union REGS *outregs);

int int86x(int intr_num, union REGS *inregs,

union REGS *outregs, struct SREGS *segregs);

Эти функции вызывают программное прерывание, указанное в intr_num. Перед выполнением этих функций они копируют inregs в регистры общего назначения процессора. После завершения работы обе функции копируют содержимое регистров в outregs. Эти функции возвращают значение регистра общего назначения AX. Если произошла ошибка, то устанавливается флаг состояния (x.cflag!=0) и системная переменная _doserrno принимает значение кода ошибки.

Структура REGS:

union REGS {

struct WORDREGS x;

struct BYTEREGS h; };

struct WORDREGS {

unsigned int ax, bx, cx, dx;

unsigned int si, di, cflag, flags; };

struct BYTEREGS {

unsigned char al, ah, bl, bh;

unsigned char cl, ch, dl, dh; };

int86x, кроме того, использует регистры ds и es, а потом восстанавливает ds. Для задания этих регистров используется структура SREGS:

struct SREGS {

unsigned int es;

unsigned int cs;

unsigned int ss;

unsigned int ds; };

Пример: установка курсора в позицию x, y. В документации по ДОС указано, что это устройство (дисплей) обслуживает прерывание ДОС 10 (все числа шестнадцатиричные). Функция, выполняющая это действие, 2 (заносится в регистр AX). При этом координаты x и y заносятся соответственно в DL и DH, в BH заносится номер видеостраницы (в нашем случае 0).

#include <stdio.h>

#include <dos.h>

#include <conio.h>

/* функция вывода курсора в позицию x,y */

void goto_xy(int x, int y)

{

union REGS reg;

reg.h.ah=2;

reg.h.dl=x;

reg.h.dh=y;

reg.bh=0;

int86(0x10,&reg,&reg);

}

main()

{

int x,y;

clrscr();

printf("Введите координаты курсора (x,y): ");

scanf("%d%d",&x,&y);

goto_xy(x,y);

/* ждем нажатия клавиши */

getch();

}

2. Интерфейс программных прерываний MSDOS. Прототипы функций:

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

int intdosx(union REGS *inregs, union REGS *outregs,

struct SREGS *segregs);

Эти функции аналогичны функциям int86 и int86x соответственно, но используют фиксированный номер прерывания 21 (шестнадцатиричный).

3. Дополнительный интерфейс программных прерываний 8086. Прототип функции:

void intr(int intr_num, struct REGPACK *preg);

где intr_num - номер прерывания, структура REGPACK:

struct REGPACK {

unsigned r_ax, r_bx, r_cx, r_dx;

unsigned r_bp, r_si, r_di;

unsigned r_ds, r_es, r_flags; };

4. Выход с оставлением программы резидентной. Прототип функции:

void keep(int status, int size);

где status - код возврата в ДОС (код завершения программы), size - количество предоставляемой программе памяти в параграфах (параграф - 16 байт).

5. Вызов программного прерывания с указанным номером. Прототип функции:

void geninterrupt(int intr_num);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]