- •В. Г. Баула Введение в архитектуру эвм и системы программирования
- •Предисловие
- •1. Понятие об архитектуре эвм
- •2. Машина Фон Неймана
- •2.1. Память
- •2.2. Устройство Управления
- •2.3. Арифметико–Логическое Устройство
- •2.4. Взаимодействие уу и алу
- •3. Учебная машина
- •3.1. Схема выполнения команд
- •3.2. Примеры программ для учебной машины.
- •3.2.1. Пример 1. Оператор присваивания.
- •3.2.2. Пример 2. Условный оператор.
- •3.2.3. Пример 3. Реализация цикла.
- •3.2.4. Пример 4. Работа с массивами.
- •3.3. Формальное описание учебной машины
- •4. Введение в архитектуру эвм
- •4.1. Адресность эвм
- •4.2. Сравнительный анализ эвм различной адресности
- •4.3. Дробно-адресная архитектура
- •4.4. Способы адресации
- •4.5. Многообразие форматов данных
- •4.6. Форматы команд
- •4.7. Базирование адресов
- •5. Понятие семейства эвм
- •6. Архитектура младшей модели семейства Intel
- •6.1. Память
- •6.2. Форматы данных
- •6.3. Вещественные числа
- •6.4. Целые числа
- •6.5. Сегментация памяти
- •6.6. Мнемонические обозначения регистров
- •6.7. Структура команд
- •6.8. Команды языка машины
- •6.8.1. Команды пересылки
- •6.8.2. Арифметические команды
- •7. Язык Ассемблера
- •7.1. Понятие о языке Ассемблера
- •7.2. Применение языка Ассемблера
- •7.3. Классификация предложений языка Ассемблер
- •7.4. Пример полной программы на Ассемблере
- •7.5. Переходы
- •7.6. Команды переходов
- •7.6.1. Команды безусловного перехода
- •7.6.2. Команды условного перехода
- •7.6.3. Команды цикла
- •7.7. Работа со стеком
- •7.8. Команды вызова процедуры и возврата из процедуры
- •7.9. Программирование процедур на Ассемблере
- •7.9.1. Стандартные соглашения о связях
- •8. Система прерываний.
- •9. Дополнительные возможности Ассемблера.
- •9.1. Строковые команды.
- •9.2. Логические команды.
- •9.3. Команды сдвига.
- •10. Модульное программирование
- •10.1. Модульное программирование на Ассемблере.
- •10.2. Схема работы редактора внешних связей.
- •10.3. Схема работы статического загрузчика.
- •10.4. Схема работы динамического загрузчика.
- •11. Понятие о системе программирования.
- •11.1. Компоненты системы программирования.
- •11.2. Характеристики исполняемых модулей.
- •11.2.1. Перемещаемые модули.
- •11.2.2. Повторно-выполняемые модули.
- •11.2.3. Повторно-входимые (реентерабельные) модули.
- •12. Макросредства языка Ассемблер.
- •12.1. Сравнение процедур и макроопределений.
- •13. Схема работы транслятора с языка Ассемблера.
- •14. Понятие о мультипрограммном режиме работы.
- •14.1. Требования к аппаратуре для обеспечения возможности работы в мультипрограммном режиме.
- •14.1.1. Система прерываний.
- •14.1.2. Механизм защиты памяти.
- •14.1.3. Аппарат привилегированных команд.
- •14.1.4. Таймер.
- •15. Архитектурные особенности современных эвм.
- •15.1. Конвейерные эвм.
- •15.2. Эвм различной архитектуры.
- •15.2.1. Архитектура эвм с общей шиной.
- •15.2.2. Достоинства и недостатки архитектуры с общей шиной.
- •15.2.3. Архитектура эвм с каналами ввода/вывода.
- •15.3. Уровни параллелизма.
- •Список литературы.
11.2.2. Повторно-выполняемые модули.
Повторное выполнение модуля предполагает, что, будучи один раз загруженным в оперативную память, он допускает своё многократное исполнение (т.е. вход в начало этого модуля после его завершения). Естественно, что процедуры и функции по определению являются повторно используемыми, однако для основной (головной) программы дело обстоит сложнее. Для головной программы на Ассемблере должно выполняться следующее условие: программа не должна менять переменные с начальными значениями или, в крайнем случае, восстанавливать эти значения перед окончанием программы. Например, если в программе на Ассемблере имеются предложения
X dw1
. . .
movX,2
то программа будет повторно используемой только тогда, когда она восстанавливает первоначальное значение переменной X перед выходом из программы. В настоящее время это свойство программы не имеет большого значения, потому что появилось более сильное свойство модуля – быть повторно-входимым (реентерабельным).
11.2.3. Повторно-входимые (реентерабельные) модули.
Свойство исполняемого модуля быть реентерабельным (иногда говорят – параллельно используемым) является очень важным, особенно при написании системных программ. Модуль называется реентерабельным, если он допускает повторный вход в своё начало до выхода из этого модуля (для модулей на Ассемблере, как мы знаем, выход производится по команде возврата ret для процедур, по команде iret для обработчиков прерываний или по макрокоманде finish для основной программы).
Особо подчеркнём, что повторный вход в такой модуль производит не сам этот модуль, используя прямую или косвенную рекурсию, а другие программы, обычно при обработке сигналов прерываний. Таким образом, внутри реентерабельного модуля могут располагаться несколько текущих точек выполнения программы. Мы уже сталкивались с такой ситуацией при изучении системы прерываний, когда выполнение процедуры-обработчика прерывания с некоторым номером могло быть прервано новым сигналом прерывания с таким же номером, так что производился повторный вход в начало этой же процедуры до окончания обработки текущего прерывания.
Каждая текущая точка выполнения реентерабельной программы имеет, как мы уже упоминали, своё поле сохранение (иногда его называют контекстом процесса). При прерывании выполнения программы на этом поле сохраняются, в частности, все регистры, определяющие текущую точку выполнения (как сегментные регистры и регистр флагов, так и регистры общего назначения, и регистры для работы с вещественными числами).
Главное отличие реентерабельных программ от обычных рекурсивных процедур заключается именно в том, что при каждом входе в реентерабельную программу порождается новая текущая точка её выполнения и новое поле сохранения. Это позволяет продолжить выполнение реентерабельной программы с любой из этих нескольких текущих точек выполнения программы, восстановив значения всех регистров из поля сохранения этой точки программы.
Ниже перечислены основные свойства, которыми должен обладать модуль на Ассемблере, чтобы быть реентерабельным.
Модуль не меняет сегменты кода.
Модуль либо совсем не имеет собственных сегментов данных (т.е. использует сегмент данных другого модуля, на этот сегмент данных, как обычно, указывает значение регистра DS), либо при каждом входе получает новые копии своих сегментов данных.
При каждом входе в модуль он получает новый сегмент стека, пустой для основной программы и с копиями фактических параметров и адресом возврата для процедуры. Вообще говоря, этот сегмент стека является возможным местом и для расположения области сохранения модуля, хотя на современных ЭВМ область сохранения обычно размещается в так называемом пространстве ядра операционной системы, это место является защищённым от изменения со стороны программ обычных пользователей.
Реентерабельность является особенно важной при написании системных программ. Это следует из того, что если некоторая программа (например, компилятор с Ассемблера) является реентерабельной, то в оперативной памяти достаточно иметь только одну копию этой программы, которая может одновременно использоваться при компиляции любого числа программ на Ассемблере (отсюда второе название таких модулей – параллельно используемые).1
В современных ЭВМ большинство системных программ являются реентерабельными.