Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Формальное описание учебной машины
При описании архитектуры учебной ЭВМ на естественном языке многие вопросы остались нераскрытыми. Что, например, будет после выполнения команды из ячейки с адресом 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. [4] Наша программа ведёт себя почти так же, как учебная машина. Одно из немногих мест, где это поведение расходится, показано в тексте программы, например, при реализации команды сложения вещественных чисел. Программа на Паскале при переполнении (когда результат сложения не помещается в переменную S) производит аварийное завершение программы, а учебная машина просто присваивает регистру Err значение 1. Наше формальное описание отвечает и на вопрос о том, как в учебной машине представляются целые и вещественные числа: точно так же, как в переменных на Паскале. Это представление мы изучим в нашем курсе несколько позже. Заметим также, что память учебной машины как бы замкнута в кольцо: после выполнения команды из ячейки с адресом 511 (если это не команда перехода) следующая команда будет выполняться из ячейки с адресом ноль. Такая организация памяти типична для многих современных ЭВМ.
|