В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования (975817), страница 5
Текст из файла (страница 5)
Ниже приведена реализация учебной машины на языке Турбо-Паскаль:
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. 4
Наша программа ведёт себя почти так же, как учебная машина. Одно из немногих мест, где это поведение расходится, показано в тексте программы, например, при реализации команды сложения вещественных чисел. Программа на Паскале при переполнении (когда результат сложения не помещается в переменную 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;
R1 := <A4>; S := S КОП2 R1; <A1> := S
4.2. Сравнительный анализ ЭВМ различной адресности
При изучении ЭВМ с разным количеством адресов естественно встаёт вопрос, какая архитектура лучше, например, даёт программы, занимающие меньше места в памяти (что было весьма актуально для первых ЭВМ). Исследуем этот вопрос, составив небольшой фрагмент программы для ЭВМ с различной адресностью. В качестве примера рассмотрим реализацию оператора присваивания, который содержит типичный набор операций: x := a/(a+b)2. В наших примерах мы будем использовать мнемонические коды операций и мнемонические имена для номеров ячеек памяти, в которых хранятся переменные (т.е. мы не будем производить явного распределения памяти, так как это несущественно для нашего исследования). Кроме того, не будем конкретизировать тип величин, это тоже не влияет на размер программы.
-
Трёхадресная машина.
СЛ | x | a | B | X := a+b |
УМН | x | x | X | X := (a+b)2 |
ДЕЛ | x | a | x | X := a/(a+b)2 |
Длина программы: 3*10 = 30 байт.
-
Двухадресная машина.
ПЕР | R | a | R := a |
СЛ | R | b | R := a+b |
УМН | R | R | R := (a+b)2 |
ПЕР | X | a | x := a; |
ДЕЛ | X | R | x := a/(a+b)2 |
Длина программы: 5*7 = 35 байт.
-
Одноадресная машина.
СЧ | A | S := a |
СЛ | B | S := a+b |
ЗП | X | x := a+b |
УМН | X | x := (a+b)2 |
ЗП | X | |
СЧ | A | S := a/(a+b)2 |
ДЕЛ | X | |
ЗП | X |
Длина программы: 8*4 = 32 байта.
-
Безадресная машина.
ВСТЕК | A | Поместить a в стек |
ВСТЕК | Дублировать вершину стека | |
ВСТЕК | B | Теперь в стеке 3 числа: b,a,a |
СЛ | В стеке два числа: b+a, a | |
ВСТЕК | Дублировать вершину стека, в стеке b+a,b+a,a | |
УМН | В стеке (a+b)2,a | |
ОБМЕН | Поменять местами два верхних элемента стека | |
ДЕЛ | В стеке a/(a+b)2 | |
ИЗСТЕКА | X | Запись результата из стека в x |
В данной программе использовались команды разной длины (безадресные и одноадресные). Длина программы: 3*4 + 6*1 = 18 байт.
Наше небольшое исследование показало, что архитектура ЭВМ с безадресными командами даёт наиболее компактные программы. В начале развития вычислительной техники такие компьютеры были весьма распространены, их, в частности, выпускала известная фирма Барроуз (Burroughs). Однако в дальнейшем были предложены ЭВМ с другой архитектурой, которая позволила писать не менее компактные программ, и в настоящее время стековые ЭВМ используются редко.
4.3. Дробно-адресная архитектура
Далее мы рассмотрим архитектуру ЭВМ, которые называются компьютерами с адресуемыми регистрами, в русскоязычной литературе они часто называются дробно-адресными [3,4] (смысл этого названия мы скоро выясним). Эти компьютеры должны давать возможность писать такие же компактные программы, как и компьютеры с безадресной системой команд, но при этом они обладают рядом дополнительных достоинств.
Компьютеры дробно-адресной архитектуры нарушают один из принципов фон Неймана – принцип однородности памяти. Будем считать, что память, к которой может непосредственно обращаться центральный процессор, состоит из двух частей, каждая со своей независимой нумерацией ячеек. Одна из этих частей называется адресуемой регистровой памятью и имеет небольшой объём (порядка десятков ячеек), а другая называется основной (оперативной) памятью большого объёма. Ячейка каждого из видов памяти имеет свой адрес, но в случае с маленькой регистровой памятью этот адрес имеет размер в несколько раз меньший, чем адрес ячейки основной памяти.