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

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

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

Адресное пространство ввода-вывода. Микропроцессор обеспечивает отдельное адресное пространство ввода-вывода, отличное от адресного пространства физической памяти. Оно состоит из 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

Команды 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 (по умолчанию реакция на прерывание отсутствует).