- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Функции работы с портами машины
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,®,®);
}
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);