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

5.9. Команды ввода-вывода

Операции ввода-вывода.Периферийные устройства имеют один или более встроенных регистров, к которым можно получить доступ. Каждое устройство ввода-вывода имеет адрес для каждого такого регистра. Порт ввода-вывода может быть портом ввода, портом вывода, либо двунаправленным портом. Некоторые порты используются для передачи данных, например, регистры приема и передачи последовательного интерфейса. Другие порты ввода-вывода используются для управления периферийными устройствами, например, регистры управления контроллером дисковода.

Адресное пространство ввода-вывода.Микропроцессор обеспечивает отдельное адресное пространство ввода-вывода, отличное от адресного пространства физической памяти. Оно состоит из 64К адресуемых 8-битовых портов. Любые два последовательно расположенные 8-битовых порта могут рассматриваться как один 16-битовый порт, а любые четыре – как один 32-битовый порт.

Команды ввода-выводаIN и OUT пересылают данные между портами ввода-вывода и регистрами EAX (32-разрядный ввод-вывод), AX (16-разрядный ввод-вывод) и AL (8-разрядный ввод-вывод). Команды адресуют порты ввода-вывода по адресу, задаваемому в команде, либо косвенно, при помощи адреса в регистре DX (табл. 62 и 63). Флаги команды не изменяют.

Табл. 62. Команда IN.

Код

Инструкция

Описание

E4 ib

IN AL, imm8

Ввод в AL из порта imm8.

E5 ib

IN AX, imm8

Ввод в AX из порта imm8.

EC

IN AL, DX

Ввод в AL из порта [DX].

ED

IN AX, DX

Ввод в AX из порта [DX].

Табл. 63. Команда OUT.

Код

Инструкция

Описание

E6 ib

OUT imm8, AL

Вывод из ALв портimm8.

E7 ib

OUT imm8, AX

Вывод из AXв портimm8.

EE

OUT DX, AL

Вывод из AL в порт [DX].

EF

OUT DX, AX

Вывод из AX в порт [DX].

Приведем примеры выполнения операций ввода-вывода:

MOV DX, 10h ; записать номер порта 10h в регистр DX

MOV AL, 20h ; записать значение 20h в регистр AL

OUT DX, AL ; вывести значение 20h в порт 10h

IN AL, 10h ; получить байт данных в регистр AL из порта ввода по адресу 10h

5.10. Команды прерываний

Команды IRET/INT/INTOреализуют механизм обработки прерываний, который заключается во временном приостановлении выполнения текущей программы и переходе к подпрограмме обработке прерывания. Подробно эти вопросы рассматривается в главе 6.

Команда IRETобеспечивает возврат из обработчика прерывания к прерванной программе (табл. 64). Флаги восстанавливаются из стека. Встретив инструкцию IRET, процессор восстанавливает из стека регистровую пару CS:IPи регистр флагов.

Команда INTвырабатывает программное прерывание по указанному вектору. Флаги в момент записи содержимого регистра флагов в стек имеют состояние на момент начала выполнения инструкции. После выполнения прерывания флаги IF и TF обнуляются.

Табл. 64. Команды прерываний.

Код

Инструкция

Описание

CF

IRET

Возврат из прерывания.

CC

INT 3

Прерывание по вектору 3.

CD ib

INT imm8

Прерывание по вектору imm8.

CE

INTO

Генерация прерывания при OF=1.

Прерывание по вектору 3 (по адресу 0000:000Ch) отладочное и может быть выработано инструкциями двух видов – специальной однобайтовой с кодом CC и общей двухбайтовой CD 03. Трансляторы с языка ассемблера для инструкции INT 3 всегда генерируют код CC; двухбайтовый код CD 03 может быть при необходимости сформирован вручную. Однобайтовый код операции используется отладчиками для формирования точек останова, поскольку позволяет заменить код операции любой команды, в том числе и однобайтовой.

Команда INTOвырабатывает прерывание по вектору 4 (по адресу 0000:0010h), если флаг переполнения OF установлен. После выполнения прерывания флаги IF и TF сбрасываются. Флаги в регистре флагов в момент записи его содержимого в стек имеют состояние на момент начала выполнения инструкции прерывания.

Команда INTO обычно размещается после команд, которые могут вызвать установку флага OF, с целью выработки прерывания при возникновении переполнения мантиссы. При начальной загрузки по адресу вектора прерывания 4 записывается адрес некоторой ячейки памяти, содержащей команду IRET (по умолчанию реакция на прерывание отсутствует).