- •В. Г. Баула Введение в архитектуру эвм и системы программирования
- •Предисловие
- •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. Уровни параллелизма.
- •Список литературы.
3.2.4. Пример 4. Работа с массивами.
Пусть требуется написать программу для ввода массива x из 100 вещественных чисел и вычисления суммы всех элементов этого массива:
Будем предполагать, что длина программы не превышает 200 ячеек, и поместим массив x, начиная с 200-ой ячейки памяти. Вещественную переменнуюSс начальным значением0.0и целую переменнуюiс начальным значением100разместим в конце текста программы. На рис. 3.4 приведён текст этой программы.
№ |
Команда |
Комментарий | |||
001 |
ВВВ |
200 |
100 |
000 |
Read(x); массив x в ячейках 200299 |
2 |
СЛВ |
008 |
200 |
008 |
S := S+x[1] |
3 |
СЛЦ |
002 |
002 |
011 |
Модификация команды в ячейке 2 |
4 |
ВЧЦ |
010 |
010 |
009 |
n := n-1 |
5 |
УСЛ |
006 |
006 |
002 |
Следующая итерация цикла |
6 |
ВЫВ |
008 |
001 |
000 |
Write(S) |
7 |
СТОП |
000 |
000 |
000 |
Стоп |
8 |
<0.0> |
Переменная S = 0.0 | |||
9 |
00 |
000 |
000 |
001 |
Целая константа 1 |
010 |
00 |
000 |
000 |
100 |
Переменная n с начальным значением 100 |
1 |
00 |
000 |
001 |
000 |
Константа переадресации |
Рис 3.4. Текст программы четвёртого примера.
Рассматриваемая программа выделяется своим новым приёмом программирования и может быть названа самомодифицирующейся программой. Обратим внимание на третью строку программы. Содержащаяся в ней команда изменяет исходный код программы (команду в ячейке 2) для организации цикла перебора элементов массива. Модифицируемая команда рассматривается как целое число, которое складывается со специально подобранноеконстантой переадресации. Согласно одному из принципов фон Неймана, числа и команды в учебной машине неотличимы друг от друга, а, значит, изменяя числовое представление команды, мы можем изменять и её суть.
У такого метода программирования есть один существенный недостаток: модификация кода программы внутри её самой может привести к путанице и вызвать появление ошибок. Кроме того, самомодифицирующуюся программу трудно понимать и вносить в неё изменения. В нашей учебной машине это, однако, единственныйспособ обработки массивов. В других архитектурах ЭВМ, с которыми мы познакомимся несколько позже, есть и другие, более эффективные способы работы с массивами, поэтому метод с модификацией команд не используется.
3.3. Формальное описание учебной машины
При описании архитектуры учебной ЭВМ на естественном языке многие вопросы остались нераскрытыми. Что, например, будет после выполнения команды из ячейки с адресом 511? Какое значение после нажатия кнопки ПУСК имеют ячейки, расположенные вне введённой программы? Как представляются целые и вещественные числа? Для ответа на почти все такие вопросы мы приведём формальное описание нашей учебной машины. В качестве метаязыка мы будем использовать Турбо-Паскаль, на котором Вы работаете. Другими словами, мы напишем программу, выполнение котороймоделируетработу нашей учебной машины, т.е. наша машина, по определению, работаетпочти так же, как и написанная нами программа на Паскале.
Ниже приведена реализация учебной машины на языке Турбо-Паскаль:
programУМ_3(input, output);
const
N = 511;
type
Address = 0..N;
Tag = (kom, int, fl); {В машинном слове может хранится команда, целое
или вещественное число}
Komanda = packed record
KOP: 0..31;
A1, A2, A3: Address;
end;
Slovo = packed record
caseTagof
kom: (k: Komanda);
int: (i: LongInt)
fl: (f: Single);
end
Memory = array[0..N]ofSlovo;
var
Mem: Memory;
S, R1, R2: Slovo; {РегистрыАЛУ}
RK: Komanda; {Регистр команд}
RA: Address; {Счётчикадреса}
Om: 0..2; {Регистр w}
Err: Boolean;
begin
Input_Program; {Эта процедура должна вводить текст программы с устройства
ввода в память по кнопке ПУСК}
Om := 0; Err := False; RA := 1; {Начальная установка регистров}
with RK do
repeat {Основной цикл выполнения команд}
RK := Mem[RA].k;
RA := (RA+1) mod(N+1);
case KOP of {Анализ кода операции}
00: { ПЕР}
begin R1 := Mem[A3]; Mem[A1] := R1end;
01: { СЛВ}
begin
R1 := Mem[A2]; R2 := Mem[A3]; S.f := R1.f + R2.f;
ifS.f = 0.0thenOM := 0else
ifS.f < 0.0thenOM := 1elseOM := 2;
Mem[A1] := S; { Err := ? }
end;
09: { БЕЗ}
RA := A2;
24: { МОД}
begin
R1 := Mem[A2]; R2 := Mem[A3];
ifR2.i = 0thenErr :=Trueelse begin
S.i := R1.i modR2.i; Mem[A1] := S;
ifS.i = 0then OM := 0else
ifS.i < 0thenOM := 1elseOM := 2;
end
end;
13: { СТОП } ;
{ Реализация остальных кодов операций }
else
Err := True;
end; { case }
untilError(KOP = 31)
end.
Для хранения машинных слов мы описали тип Slovo, который является записью с вариантами языка Турбо-Паскаль. В такой записи на одном и том же месте памяти могут располагаться команды, длинные (32-битные) целые числа или же 32-битные вещественные числа типаSingle.1
Наша программа ведёт себя почти так же, как учебная машина. Одно из немногих мест, где это поведение расходится, показано в тексте программы, например, при реализации команды сложения вещественных чисел. Программа на Паскале при переполнении (когда результат сложения не помещается в переменную S) производит аварийное завершение программы, а учебная машина просто присваивает региструErrзначение1. Наше формальное описание отвечает и на вопрос о том, как в учебной машине представляются целые и вещественные числа: точно так же, как в переменных на Паскале. Это представление мы изучим в нашем курсе несколько позже.
Заметим также, что память учебной машины как бы замкнута в кольцо: после выполнения команды из ячейки с адресом 511(если это не команда перехода) следующая команда будет выполняться из ячейки с адресом ноль. Такая организация памяти типична для многих современных ЭВМ.