- •Содержание
- •1. Введение
- •2. Представление информации в эвм
- •2.1. Системы счисления
- •2.1.1. Основные понятия
- •2.1.2. Системы счисления, используемые в вычислительной технике
- •2.1.3. Перевод чисел из одной системы счисления в другую
- •2.2. Типы данных
- •2.2.1. Типы данных, используемых в эвм
- •2.2.2. Константы
- •2.2.3. Логические величины
- •2.2.4. Символьные величины
- •2.2.5. Целые числа
- •2.2.6. Вещественные числа
- •2.3. Форматы команд
- •3. Основы построения эвм
- •3.1. Немного истории
- •3.2. Особенности архитектуры современной вычислительной машины
- •3.2.1. Основные понятия
- •3.2.2. Структурная организация машины
- •3.3. Вариант структуры микроЭвм
- •3.3.1. Общая структура машины
- •3.3.2. Процессор
- •3.3.3. Оперативная память
- •3.3.4. Системная память
- •3.3.5. Система адресации
- •3.3.6. Виртуальная память
- •3.3.7. Таймер
- •3.3.8. Внешние устройства
- •3.3.9. Принципы обмена информацией с внешними устройствами
- •Некоторые вопросы программного обеспечения
- •4.1. О программном обеспечении
- •4.2. Процесс компиляции
- •4.3. Компиляция с языка Ассемблера
- •5. Особенности архитектуры эвм типа ibm-рс
- •5.1. Введение
- •5.2. Исторический обзор процессоров клона 80х86
- •5.3. Классификация процессоров Intel 80х86
- •5.4. Особенности периферийных устройств ibm-pc
- •5.5. Характеристики компьютера
- •5.6. Сегментная адресация
- •5.7. Особенности распределения адресного пространства в компьютерах ibm-pc
- •5.7.1. Стандартная оперативная память (Conventional memory)
- •5.7.2. Область верхней памяти (Upper Memory Area ‑ uma)
- •5.7.3. Область высшей памяти (High Memory Area ‑ hma)
- •5.7.4. Расширенная память (eXtended Memory Specification — xms)
- •5.7.5. Дополнительная память (Expanded Memory Specification — ems)
- •5.8. Обмен информацией с периферийными устройствами
- •5.8.1. Порты ввода/вывода
- •5.8.2. Использование адресного пространства памяти
- •5.8.3. Прямой доступ к памяти
- •5.9. Прерывания
- •5.10. Начальный запуск эвм
- •5.11. Регистры процессора
- •5.11.1. Регистры общего назначения
- •5.11.2. Указатель инструкций
- •5.11.3. Регистр флагов и управляющие регистры
- •5.11.4. Регистры сегментов и селекторов
- •5.11.5. Системные адресные регистры
- •5.11.6. Регистры отладки
- •5.11.7. Регистры тестирования и модельно-специфические регистры
- •6. Debug — средство непосредственной коррекции и отладки загрузочного кода программ
- •6.1. Введение
- •6.1.1. Команды без аргумента
- •Input I порт
- •6.1.2. Команды обращения к ячейкам
- •15D0:010c bfffff mov di,ffff
- •15D0:010f 57 push di
- •6.1.3. Команды запуска программы
- •6.1.4. Команды просмотра и модификации регистров
- •7. Методы адресации
- •7.1. Введение
- •7.2. Регистровый метод адресации
- •159B:0101 1e push ds
- •159B:0101 1e push ds
- •159B:0101 1e push ds
- •7.3. Непосредственный метод адресации
- •7.4. Прямая адресация
- •7.5. Косвенная регистровая адресация
- •159B:0100 not word ptr [bx]
- •159B:0102 e000 loopnz 0104
- •7.6. Адресация по базе
- •7.7. Косвенная регистровая адресация с индексированием
- •159B:0102 0e push cs
- •7.8. Адресация по базе с индексированием
- •7.9. Относительная адресация
- •7.10. Косвенная регистровая адресация с масштабированием
- •7.11. Адресация по базе с индексированием и масштабированием
- •8. Синтаксис ассемблера
- •8.1. Директивы определения данных
- •8.1.1. Определение переменных
- •Cимвольные строки
- •Числовые данные
- •Примеры:
- •8.2. Выражения
- •8.3. Непосредственные операнды
- •8.4. Структуры
- •8.5. Сегменты
- •8.6. Модели памяти и упрощенные директивы определения сегментов
- •8.7. Упрощенные директивы описания сегментов
- •8.8. Создание программы на ассемблере
- •8.9. Получение выполняемого файла
- •9. Система команд
- •9.1. Классификация команд по операндам
- •9.2. Классификация команд по действию
- •9.2.1. Команды пересылки данных
- •9.2.2. Арифметические команды
- •8.2.3. Команды манипуляции битами
- •9.2.4. Управление центральным процессором
- •9.2.4. Команды передачи управления
- •Iret, iretd
- •9.3. Краткий список команд с используемыми операндами
- •9.3.1. Условные обозначения:
- •9.3.2. Инструкции пересылки данных
- •9.3.3. Арифметические, логические и инструкции сдвига
- •9.3.4. Инструкции обработки строк
- •9.3.5. Инструкции передачи управления
- •9.3.6. Инструкции управления процессором
- •Литература
5.9. Прерывания
Микропроцессоры 8086 и 8088 обеспечивают возможность реакции на внешние события и на различные особые ситуации, возникающие в процессе выполнения программы, используя механизм прерываний (interrupts). Прерывание — это изменение последовательности команд, предопределенной исполняемым программным кодом.
В реальном режиме возможна обработка до 256 различных прерываний, которые делятся на внешние аппаратные, внутренние аппаратные и программные, организованные по приоритетному принципу. Программные прерывания вызываются специальными командами, аппаратные происходят в результате внешнего (по отношению к процессору) события или же в результате возникновения нештатной ситуации в программе (например, деления на ноль).
В процессорах с 80286 появилось понятие исключения (особые случаи, exceptions). Они делятся на:
отказы (fault) — исключение, обнаруженное до выполнения команды, вызвавшей ошибку. Возврат из обработчика отказа передает управление на эту команду, и будет предпринята еще одна попытка ее выполнения. Отказы используются, например, для организации виртуальной памяти;
ловушки (trap) — исключение, которое обнаруживается и обслуживается после выполнения команды, вызвавшей ошибку. Возврат из обработчика ловушки передает управления на следующую за вызвавшей исключение команду. К ловушкам относятся программные прерывания;
аварийное завершение (abort) — исключение, не позволяющее точно установить команду, его вызвавшую. Оно используется для сообщения о серьезных ошибках, таких как ошибки аппаратуры или повреждение системных таблиц.
Каждое прерывание имеет собственный номер. В ОЗУ существует таблица векторов прерываний, каждый вектор которой указывает на процедуру-обработчик соответствующего прерывания. После выполнения вызванной процедуры, управление возвращается в исходную точку (в зависимости от вида прерывания), и продолжается выполнение первоначальной программы. В защищенном режиме таблица векторов прерываний расширяется до таблицы дескрипторов прерываний, причем ее размер может задаваться программно в диапазоне от 32 до 256 дескрипторов. Адрес таблицы в реальном режиме, как правило, 0h, в защищенном — задается программно.
Внутреннее прерывание у процессоров 8086 и 8088 выполняется в следующих случаях:
некорректная команда (деление на ноль, неверный код операции, трассировочное прерывание, и т.д.);
команда программного прерывания (int, into).
Условий возникновения внутренних прерываний и исключений в более поздних процессорах довольно много, особенно в защищенном режиме.
Внешние прерывания ранних IBM-PC инициировались в следующих случаях:
на линию INTR процессора поступает запрос на обработку прерывания от внешнего устройства (маскируемые внешние прерывания);
обнаружена серьезная ошибка или ситуация, требующая немедленного вмешательства процессора, о чем сигнализирует сигнал на линии NMI (немаскируемое прерывание).
В более поздних ЭВМ, помимо этих двух линий, существует встроенный контроллер прерываний (APIC).
При работе с внешними устройствами возможны два подхода:
постоянный опрос устройства на предмет его готовности к обмену данными;
выполнение какой либо посторонней задачи с разрешенным механизмом прерываний. Как только устройство готово к обмену, оно передает сигнал запроса прерывания (IRQ — Interrupt ReQuest) и процессор начинает выполнять программу-обработчик прерывания, которая и выполняет обмен информацией с устройством.
Второй путь, использующий прерывания, имеет следующие особенности.
Можно избежать циклов опроса устройства, которые требуют значительного процессорного времени.
Отладка и, порой, разработка обработчика прерываний сложнее обычной программы с циклическим опросом устройства.
Прерывания позволяют очень оперативно реагировать на устройства, которым нужна быстрая обработка, чтобы не потерять данные.
Для управления внешними прерываниями используется внешний контроллер прерываний, выполняющий функции арбитра, сигнализирует процессору о внешнем прерывании по линии INTR и передает его номер. Контроллер, использовавшийся в ранних IBM-PC, допускал обслуживание до 8 внешних устройств. В более поздних машинах стали использовать каскадное соединение двух контроллеров, что позволило увеличить число устройств до 15. В современных машинах в чипсет входит схема, эмулирующая каскадное соединение двух контроллеров. Ее возможности порой превосходят «классический» каскад, однако детали работы зависят от конкретного чипсета.
Часть номеров прерываний в машине зарезервирована для стандартных устройств на материнской плате, а часть может использоваться внешними устройствами.
В приведенной ниже таблице указаны стандартные прерывания:
Номер |
Применение |
Комментарий |
0 |
Timer |
Системный таймер, 18.2 раза в секунду |
1 |
Keyboard |
При нажатии и отпускании клавиш |
2 |
Cascade |
Второй контроллер |
3 |
COM2, COM4 |
|
4 |
COM1, COM3 |
|
5 |
LPT2 |
|
6 |
Diskette |
|
7 |
LPT1 |
|
8 |
RTC |
CMOS Real Time Clock |
9 |
Свободно |
|
10 |
Video |
Обратный ход луча. Редко используется |
11 |
Мышь PC/2 |
|
12 |
Свободно |
|
13 |
Math |
Прерывание сопроцессора |
14 |
IDE1 |
|
15 |
IDE2 |
|
Некоторые из стандартных прерываний разрешается использовать для других целей, если устройство, стандартно связанное с данным прерыванием, отсутствует либо не используется.
Конфликт номеров прерываний — это ситуация, в которой несколько устройств вызывают одно и то же прерывание, а обработчик этого прерывания не умеет отличать запросы одного устройства от запросов другого (большинство современного программного обеспечения как раз не умеет).
Вызов прерывания — это довольно длительный процесс. Для начала обработки прерывания должно закончиться выполнение очередной команды, должны быть сохранены некоторые регистры процессора (как правило, регистр сегмента кода, счетчик команд и регистр флагов), которые после завершения обработчика необходимо восстановить и т.д. Поэтому надо минимизировать количество прерываний на единицу информации. То есть надо передавать информацию блоками в синхронном режиме, а прерывание должно генерироваться только одно, при поступлении блока.