Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебная практика 2-го курса.doc
Скачиваний:
20
Добавлен:
28.09.2019
Размер:
161.79 Кб
Скачать

Работа с прерываниями на языке Ассемблера и яву (с, Pascal)

Работая на языке Ассемблера, при необходимости вызова той или иной функции DOS или BIOS программист должен предварительно загрузить в определенные регистры процессора номер функции и ее аргументы и вызвать прерывание по номеру.

Программируя на языке С или Pascal, можно пользоваться функциями стандартных модулей. Оба они носят одноименное название DOS и поддерживают обращение к прерываниям DOS и BIOS.

Процедуры языка Pascal

GetIntVec (N : byte; var Adress: Pointer)

Возвращает в переменную Adress адрес программы обработки прерывания с номером N.

SetIntVec (N : byte; var Adress: Pointer)

Устанавливает в DOS новую подпрограмму обработки прерывания с номером N, замещая старое значение адреса на Adress.

Intr (N : byte; var R : Registers)

Активизирует программное прерывание N, передавая ему номер функции и параметры в переменной R.

MsDos(var R : Registers)

Специализированный вызов прерывания с номером 21h.

В модуле DOS так же определн тип Registers, который является записью с вариантами:

Registers = record

Case Integer of

0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : word);

1: (AL,AH,BL,BH,CL,CH,DL,DH :byte);

end;

Функции языка С

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

int intdosx(union REGS *inregs, union REGS *outregs, struct SREGS *segregs);

Эти функции выполняют вызов определенной функции 21h-го прерывания DOS .

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

int int86x(int intno, union REGS *inregs, union REGS *outregs, struct SREGS *segregs);

Альтернативный вызов функции DOS

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

Альтернативный вызов функции DOS по номеру intno

void geninterrupt(int intr_num);

Осуществляет вызов прерывания по номеру intr_num

Объединение REGS используется для доступа к регистрам микропроцессора с помощью функций: int86, int86x, intdos, intdosx:

union REGS {

struct WORDREGS x;

struct BYTEREGS h; };

В свою очередь структуры WORDREGS и BYTEREGS дают доступ к 16-ти разрядным регистрам и их 8-ми разрядным частям:

struct BYTEREGS {

unsigned char al, ah, bl, bh;

unsigned char cl, ch, dl, dh;

};

struct WORDREGS {

unsigned int ax, bx, cx, dx;

unsigned int si, di, cflag, flags;

};

Обмен данными через порты

Во время работы микропроцессору приходится обмениваться данными с внешними устройствами. Передача управляющих сигналов и данных осуществляется через порты.

Порты представляют собой своеобразные “двери”, через которые информация поступает на внешние устройства или передается с них. Одно устройство может использовать несколько портов. Каждый порт идентифицируется 16-разрядным номером. Диапазон номеров от 0 до 65535. Как и при доступе к памяти, процессор для связи с портами использует шины данных и адреса. При обращении к порту вначале по управляющей шине идет сигнал, который оповещает, все внешние устройства, что адрес на шине является адресом порта, а затем посылает сам адрес. То устройство, адрес которого совпадает, дает ответ. Номер порта – это адрес ячейки памяти, которая имеет 8 или 16 разрядов и является частью устройства, а не оперативной памяти.

Основной способ обращения к портам заключается в применении команд IN и OUT языка Ассемблер. По команде IN происходит считывание одного байта или одного слова из порта. По команде OUT происходит запись одного байта или одного слова в порт.

Ниже представлены номера портов центрального процессора, используемые в операционной системе MS-DOS для каких-то конкретных целей.

Порт центрального процессора CPU Адрес ввода/вывода Вектор прерывания

Таймер 040=043 8

Клавиатура 060=063 9

Последовательный порт СОМ2 2F8=2FF 11

Последовательный порт СОМ1 3F8=3FF 12

Жесткий диск 320=32F 13

Гибкий диск 3F0=3F7 14

Параллельный порт LPT1 378=37F 15

Монохромный дисплей 380=3BF -

Цветной дисплей 3D0=3DF -