Формальное описание учебной машины
При описании архитектуры учебной ЭВМ на естественном языке многие вопросы остались нераскрытыми. Что, например, будет после выполнения команды из ячейки с адресом 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: { ПЕР }
beginR1 := 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 thenOM := 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 (если это не команда перехода) следующая команда будет выполняться из ячейки с адресом ноль. Такая организация памяти типична для многих современных ЭВМ.
Дата добавления: 2015-10-05; просмотров: 801;