Пространство ввода/вывода
В некоторых реализациях процессорных архитектур доступ к регистрам устройств осуществляется при помощи специальных команд процессора — инструкций ввода/вывода. Они ссылаются на специальные наборы выводов процессора и определяют отдельное шинно-адресное пространство для устройств ввода/вывода. Адреса на этих шинах широко известны как порты (ports)
и не имеют никакого отношения к адресации памяти. В архитектуре Intel x86 адресное пространство ввода/вывода имеет размер 64 КБ (16 разрядов), а в языке ассемблера определено две инструкции для чтения и записи в этом пространстве: 'IN'
и 'OUT' (точнее, две группы инструкций, внутри которых различие имеет место по разрядности считываемых/записываемых данных).
Поскольку при создании драйвера следует избегать привязки к аппаратной платформе, Microsoft рекомендует избегать и использования реальных инструкций IN/OUT. Вместо этого следует использовать макроопределения HAL. Соответствие между традиционными инструкциям DOS/Windows ассемблера и макроопределениями HAL приводится в таблице 5.2.
Таблица 5.2. Макроопределения HAL для доступа к портам ввода/вывода
Ассемблер х86 | Аналог HAL | Описание |
IN AL,DX IN AL,port |
READ_PORT_UCHAR | Чтение 1 байта из порта ввода/вывода |
IN AX,DX IN AX,port |
READ_PORT_USHORT | Чтение 16-ти разрядного слова из порта ввода/вывода |
IN EAX,DX IN EAX,port |
READ_PORT_ULONG | Чтение 32-х разрядного слова из порта ввода/вывода |
INSB | READ_PORT_BUFFER_UCHAR | Чтение массива байт из порта ввода/вывода |
INSW | READ_PORT_BUFFER_USHORT | Чтение массива 16-ти разрядных слов из порта ввода/вывода |
INSD | READ_PORT_BUFFER_ULONG | Чтение массива 32-х разрядных слов из порта ввода/вывода |
OUT DX,AL OUT port,AL |
WRITE_PORT_UCHAR | Запись 1 байта в порт ввода/вывода |
OUT DX,AX OUT port,AX |
WRITE_PORT_USHORT | Запись 16-ти разрядного слова в порт ввода/вывода |
OUT DX,EAX OUT port,EAX |
WRITE_PORT_ULONG | Запись 32-х разрядного слова в порт ввода/вывода |
OUTSB | WRITE_PORT_BUFFER_UCHAR | Запись массива байт в порт ввода/вывода |
OUTSW | WRITE_PORT_BUFFER_USHORT | Запись массива 16-ти разрядных слов в порт ввода/вывода |
OUTSD | WRITE_PORT_BUFFER_ULONG | Запись массива 32-х разрядных слов в порт ввода/вывода |