- •Системное программирование
- •Контрольные вопросы
- •2. Программная модель микропроцессора 8086
- •2.1. Представление информации
- •2.2. Регистры микропроцессора
- •2.3. Формат машинной команды
- •2.4. Способы задания операндов команды
- •Контрольные вопросы
- •3. Основные понятия языка ассемблера
- •3.1. Предложения
- •3.2. Директивы определения данных
- •3.3. Выражения
- •Контрольные вопросы
- •4. Сегментированная модель памяти
- •4.1. Сегментирование адресов
- •4.2. Директивы сегментации
- •4.3. Общая структура программы
- •4.4. Модели памяти
- •Контрольные вопросы
- •5. Основные группы команд
- •5.1. Соглашению по описанию команд
- •5.2. Команды пересылки данных
- •5.3. Арифметические команды
- •5.4. Логические команды
- •5.5. Команды переходов
- •5.6. Команды организации циклов
- •5.7. Команды обработки строк
- •5.8. Стековые команды
- •5.9. Команды ввода-вывода
- •5.10. Команды прерываний
- •5.11. Команды управления микропроцессором
- •Контрольные вопросы
- •6. Подпрограммы
- •Контрольные вопросы
- •7. Разработка одномодульной программы
- •7.1. Трансляция и компоновка программы
- •7.2. Отладка программы
- •Контрольные вопросы
- •8. Разработка многомодульных программ
- •8.1. Принципы разработки модулей
- •8.2. Расширенное применение директивы сегментации
- •9. Упражнения
- •Контрольные вопросы
- •Программирование микропроцессорных устройств
- •10. Программирование системного таймера
- •10.1. Описание таймера-счетчика 8254
- •10.2. Режимы работы таймера
- •10.3. Структура регистров таймера
- •10.4. Упражнения
- •Контрольные вопросы
- •11. Программирование контроллера прерываний
- •11.1. Механизм обработки прерываний
- •11.2. Типы прерываний
- •11.3. Приоритеты прерываний
- •11.4. Контроллер прерываний 8259
- •11.5. Идентификация прерываний
- •11.6. Прерывания bios и ms-dos
- •11.7. Упражнения
- •Контрольные вопросы
- •12. Программирование параллельного порта
- •12.1. Интерфейс Centronics
- •12.2. Работа с параллельным портом на низком уровне
- •12.3. Стандартные средства работы с параллельным портом
- •12.4. Упражнения
- •Контрольные вопросы
- •13. Программирование последовательного порта
- •13.1. Основы последовательной передачи данных
- •13.2. Последовательный интерфейс rs-232c
- •13.3. Универсальный асинхронный приемо-передатчик 8250
- •13.4. Порты асинхронного адаптера
- •13.5. Стандартные средства программирования последовательного порта
- •13.6. Упражнения
- •Контрольные вопросы
- •Литература
- •141 Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета
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 (по умолчанию реакция на прерывание отсутствует).