Доступ к оборудованию осуществляется через регистры внутри устройств с помощью портового ввода/вывода. Разрядность регистров 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 или заполнение буфера |