D. Доступ к оборудованию. Прерывания в защищенном режиме и в реальном режиме. Аппаратные и программные прерывания

Доступ к оборудованию осуществляется через регистры внутри устройств с помощью портового ввода/вывода. Разрядность регистров 8, 16, 32. Адресное пространство ввода/вывода не зависит от пр-ва ОП. Макс 65536 адресов.

Для управления устройством необходимо знать номера портов, а таже особенности данных. Эта информация приводится в тех. Документации к устр-ву.

Команды портового ввода/вывода

in аккумул., порт - чтение из порта

out – порт, аккум. - запись в порт

 

чтение строки из порта:

ins приемник, dx – (input string) dx – адрес порта, приемник es:edi/di

insb - читает 1 байт

insw - 2 байта

insd - 4 байта

 

запись строки в порт:

outs dx, источник dx – адрес порта, источник es:esi/si

outsb

outsw

outsd

 

 

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

2 случая вызова прерывания:

- некоторое внешнее по отношению к выполняемой программе событие

(нажатие клавиши на клавиатуре, переход принтера в состояние готовности,

деление на нуль в микропроцессоре)

-внутреннее событие выполняемой программы – то есть программный (с

помощью специальных команд) вызов прерывания.

 

Прерывания бывают программные (инициируются в выполняющей программе) и аппаратные (внешнее устройство посылает сигнал процессору, по котором тот должен обслужить устройство).

В INTEL процессорах до 256 прерываний (32 зарезервировано, остальные - пользовательские). У каждого прерывания свой номер (например 10h – обслуживание видеосистемы). Прерывания соответствуют индексам таблицы прерываний, расположенной в ОП.

В таблице хранятся векторы прерываний – адреса программ обработчиков (могут располагаться в любом месте ОП)

Реальный режим процессора: таблица начинается в ОП по адресу 0000:0000.

Каждый элемент занимает 4 байта. Старшее слово – адрес начала сегмента, младшее - смещение

Защищенный режим: адреса обработчиков в таблице IDT (interrupt descriptor table)

Адрес начала находится в специальном регистре ЦП.

 

Команды работы с прерываниями:

int число – вызов прерывания с заданным номером.

Команда int сначала заносит в стек значения следующих регистров: eflags/flags, cs, eip/ip (регистр флагов помещается в стек первым, регистр указателя инструкций – последним). Затем управление передается обработчику прерывания, номер которого равен числу, указанному в данной команде. Значение операнда команды int (значение числа) должно быть в диапазоне от 0 до 255. Занесение в стек регистра флагов делается для того, чтобы при возврате из обработчика этот регистр был восстановлен, и вычислительный процесс не был нарушен. Значения cs:eip/ip являются адресом возврата, они необходимы для правильного возврата из программы обработчика. Надо отметить, что при занесении в стек значения eip/ip этот регистр указывает на команду, следующую сразу за командой int.

 

Пример: для установки режима дисплея используется прерывание BIOS 10h

(обслуживание видеосистемы), причем в регистре ah указывается номер

функции 0 (установка режима дисплея), в al задается сам режим:

 

xor ah,ah ; функция 0 прерывания 10h – установка режима

; дисплея

mov al,3 ; в al задается режима дисплея, третий режим –

; текстовый режим, 80 столбцов × 25 строк

int 10h ; вызов прерывания, после выполнения команды

; устанавливается требуемый режим дисплея

 

В прерывании 3 пустой обработчик. (используется отладчиками для проверок или установки пошагового режима)

режим пошагового выполнения программы.

Для вызова четвертого прерывания при наличии переполнения (флаг OF=1)

используется команда into (interrupt on overflow – прерывание по

переполнению):

into

В отличие от двухбайтной команды int, длина into – один байт. Команда into вызывает прерывание 4 в том случае, если флаг переполнения OF установлен в 1. Для прерывания 4 по умолчанию устанавливается пустой обработчик прерывания, но программист может создать свой, сигнализирующий об ошибках переполнения (флаг OF модифицируется

некоторыми арифметическими, логическими и строковыми командами).

 

С 80186 вводится команда вызова прерывания 5 при условии выхода значения за рамки диапазона

Bound индекс, источник. Источник задает границы (младший байт нижнюю, старший - верхнююю)

 

Iret, iretd - команда корректного выхода из обработчика.

Команда iret извлекает из стека значение регистра ip, значение регистра cs

и значение регистра flags (первым извлекается регистр указателя инструкций,

последним – регистр флагов). Команда iretd извлекает из стека значения eip, cs

и eflags. Занесения в cs:eip/ip данных из стека реализует дальний (far) переход.

Таким образом, после выполнения iret/iretd управление передается команде, на

которую указывает пара cs:eip/ip.

 

Прерывания MS-DOS 21h

Вызов ф-й:

Mov ah, no_func

Int 21h

 

Номер ф-ии действие
Ввод символа с клав. и вывод на экран. Код заносится в al. Реагирует на ctrl-c, ctrl-break
Вывод символа из dl на экран. Реагирует на ctrl-c, ctrl-break
Нефильтрованный вывод с клав. не реагирует на ctrl-c, ctrl-break
Как и , Реагирует на ctrl-c, ctrl-break
Вывод строки из ds:dx
Буферизованный ввод с клавиатуры ds:dx – адрес начала буфера. Стр-ра: Байт макс. Длины, резервный байт (заносится кол-во символов), место для ввода строки. Конец ввода – нажатие Enter или заполнение буфера