Команды прерываний
Команды ввода-вывода
Операции ввода-вывода. Периферийные устройства имеют один или более встроенных регистров, к которым можно получить доступ. Каждое устройство ввода-вывода имеет адрес для каждого такого регистра. Порт ввода-вывода может быть портом ввода, портом вывода, либо двунаправленным портом. Некоторые порты используются для передачи данных, например, регистры приема и передачи последовательного интерфейса. Другие порты ввода-вывода используются для управления периферийными устройствами, например, регистры управления контроллером дисковода.
Адресное пространство ввода-вывода. Микропроцессор обеспечивает отдельное адресное пространство ввода-вывода, отличное от адресного пространства физической памяти. Оно состоит из 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 (по умолчанию реакция на прерывание отсутствует).