В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования, страница 5
Описание файла
Документ из архива "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования", который расположен в категории "". Всё это находится в предмете "архитектура эвм" из 2 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования"
Текст 5 страницы из документа "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования"
Будем предполагать, что длина программы не превышает 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
case Tag of
kom: (k: Komanda);
int: (i: LongInt)
fl: (f: Single);
end
Memory = array[0..N] of Slovo;
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] := R1 end;
01: { СЛВ }
begin
R1 := Mem[A2]; R2 := Mem[A3]; S.f := R1.f + R2.f;
if S.f = 0.0 then OM := 0 else
if S.f < 0.0 then OM := 1 else OM := 2;
Mem[A1] := S; { Err := ? }
end;
09: { БЕЗ }
RA := A2;
24: { МОД }
begin
R1 := Mem[A2]; R2 := Mem[A3];
if R2.i = 0 then Err := True else begin
S.i := R1.i mod R2.i; Mem[A1] := S;
if S.i = 0 then OM := 0 else
if S.i < 0 then OM := 1 else OM := 2;
end
end;
13: { СТОП } ;
{ Реализация остальных кодов операций }
else
Err := True;
end; { case }
until Err or (KOP = 31)
end.
Для хранения машинных слов мы описали тип Slovo, который является записью с вариантами языка Турбо-Паскаль. В такой записи на одном и том же месте памяти могут располагаться команды, длинные (32-битные) целые числа или же 32-битные вещественные числа типа Single. 1
Наша программа ведёт себя почти так же, как учебная машина. Одно из немногих мест, где это поведение расходится, показано в тексте программы, например, при реализации команды сложения вещественных чисел. Программа на Паскале при переполнении (когда результат сложения не помещается в переменную S) производит аварийное завершение программы, а учебная машина просто присваивает регистру Err значение 1. Наше формальное описание отвечает и на вопрос о том, как в учебной машине представляются целые и вещественные числа: точно так же, как в переменных на Паскале. Это представление мы изучим в нашем курсе несколько позже.
Заметим также, что память учебной машины как бы замкнута в кольцо: после выполнения команды из ячейки с адресом 511 (если это не команда перехода) следующая команда будет выполняться из ячейки с адресом ноль. Такая организация памяти типична для многих современных ЭВМ.
4. Введение в архитектуру ЭВМ
4.1. Адресность ЭВМ
Как мы уже упоминали, число адресов в команде называется адресностью ЭВМ. Разнообразие архитектур ЭВМ предполагает, в частности, и различную адресность команд. Рассмотрим схему выполнения команд с различным числом адресов операндов. Будем предполагать, что для хранения кода операции в команде отводится один байт (8 разрядов), а для хранения каждого из адресов – 3 байта (это обеспечивает объём памяти 224 ячеек). Ниже приведены форматы команд для ЭВМ различной адресности и схемы выполнения этих команд для случая бинарных операций (у таких операций два операнда и один результат).
-
Трёхадресная машина.
КОП | A1 | A2 | A3 | = 10 байт |
8 разрядов | 24 разряда | 24 разряда | 24 разряда |
Схема выполнения команд такой машины нам уже известна:
R1 := <A2>; R2 := <A3>; S := R1 R2; <A1> := S; { – операция}
-
Двухадресная машина.
КОП | A1 | A2 | = 7 байт |
8 разрядов | 24 разряда | 24 разряда |
Схема выполнения команд:
R1 := <A1>; R2 := <A2>; S := R1 R2; <A1> := S;
Заметим, что теперь для выполнения бинарной операции первый и второй операнды задаются явно в качестве адресов в команде, а местоположение результата операции задаётся неявно или, как говорят, по умолчанию. В рассмотренном выше случае результат операции по умолчанию помещается на место первого операнда, уничтожая его.
-
Одноадресная машина.
КОП | A1 | = 4 байта |
8 разрядов | 24 разряда |
Схема выполнения команд:
R1 := <A1>; S := S R1;
Для работы в одноадресной машине необходимы ещё две команды, которые имеют один операнд и один результат и выполняются по другим схемам. Это команда чтения числа из памяти на регистр сумматора:
СЧ A1
Она выполняется по схеме
S := <A1>
и команда записи значения из сумматора в память:
ЗП A1
Она выполняется по схеме
<A1> := S
При выполнении бинарных операций в одноадресной ЭВМ только один второй операнд задаётся в команде явно, а первый операнд и результат задаются неявно – это регистр сумматора.
-
Безадресная машина.
КОП | = 1 байт |
8 разрядов |
В отличие от других рассмотренных выше машин, безадресная машина использует при работе аппаратно реализованный в компьютере стек, для чего вводятся две дополнительные одноадресные команды: записи из памяти в стек
ВСТЕК A1
которая выполняется по схеме
R1 := <A1>; ВСТЕК(R1)
и команда чтения из стека
ИЗСТЕКА A1
которая выполняется по схеме
ИЗСТЕКА(R1); <A1> := R1
Таким образом, за исключение двух указанных выше одноадресных команд, которые имеют длину 4 байта, все остальные команды являются безадресными, имеют длину 1 байт и выполняются по схеме:
R1 := ИЗСТЕКА; R2 := ИЗСТЕКА; S := R1 R2; ВСТЕК(S)
Как видно, для безадресных команд при выполнении бинарных операций уже все аргументы (два операнда и результат) задаются неявно и располагаются в стеке. Отсюда понятно, почему часто машины этой архитектуры называются стековыми ЭВМ.
Кроме рассмотренных видов машин, существовали и другие архитектуры ЭВМ, например, четырёхадресные, в четвёртом адресе которых дополнительно хранится ещё и адрес следующей выполняемой команды. Собственно, адресов может быть и больше, с помощью таких команд можно, например, реализовать функции от многих переменных.
Существуют архитектуры ЭВМ, которые различаются не только количеством адресов в команде, но и наличием в команде нескольких кодов операций. Такие ЭВМ называются машинами с очень длинным командным словом (VLIW – very large instruction word). В этих компьютерах, например, указанные команды могут реализовывать оператор присваивания вида z:=k*(x+y) по схеме:
R1 := <x>; R2 := <y>; S := R1+R2;
R1 := <k>; S := S*R1; <z> := S
В компьютерах с такой архитектурой команда содержит два кода операции и четыре адреса аргументов:
КОП1 | КОП2 | A1 | A2 | A3 | A4 |
Такие команды могут выполняться, например, по схеме:
R1 := <A2>; R2 := <A3>; S := R1 КОП1 R2;