Turbo Pascal / Stud_2_1 / F / F2 / F2
.doc
10. УЧЕБНАЯ ВЫЧИСЛИТЕЛЬНАЯ МАШИНА F2
10.1 Архитектура ЭВМ F2
Учебная ЭВМ F2 представляет собою одноадресную машину со страничной организацией памяти.
Структурная схема ЭВМ F2 приведена на рис.10. В состав ЭВМ F2 входят следующие основные узлы:
-
оперативное запоминающее устройство емкостью 256 12-разрядных слов;
-
восьмиразрядный регистр адреса RA, определяющий номер ячейки памяти, с которой происходит взаимодействие в данный момент времени;
-
двенадцатиразрядный регистр слова RS для временного хранения читаемой или записываемой информации;
-
восьмиразрядный счетчик адреса команд SAK, предназначенный для хранения адреса следующей команды;
-
двенадцатиразрядный регистр команд RK, хранящий выполняемую команду;
-
двенадцатиразрядный регистр-аккумулятор АС для приема и хранения первого операнда и результата операции;
-
арифметико-логическое устройство АЛУ, выполняющее операцию, заданную кодом операции команды;
-
дешифратор кода операции DC;
-
четырехразрядный регистр признаков завершения операции RP.
Регистр команды состоит из трех полей:
-
поле KOP (биты 1 – 4) содержит код выполняемой операции;
-
поле P (биты 5 – 7) содержит адрес страницы,
-
поле А (биты 8 – 12) содержит адрес ячейки относительно начала страницы.
Память разбита на страницы по 32 ячейки. Исполнительный адрес формируется путем склеивания значений полей Р и А, например, при Р = 000 и А=01111 получаем (), при Р = 001 и А = 00010 получаем ().
В задачах, предусматривающих обработку массивов, рекомендуется размещать элементы массива внутри одной страницы и при переадресации изменять на единицу значение поля А соответствующих команд.
Система команд ЭВМ F2, приведенная в табл.10, включает в себя:
-
команды работы с аккумулятором: «Загрузка аккумулятора» и «Сохранение аккумулятора»;
-
арифметико-логические команды: «Сложение», «Вычитание», «Умножение», «Деление», «Вычитание модулей», «Конъюнкция», «Дизъюнкция» и «Сложение по модулю 2»;
-
команды сдвига: «Сдвиг влево арифметический» и «Сдвиг вправо арифметический»;
-
команды управления порядком выполнения программы: «Вызов подпрограммы», «Возврат из подпрограммы», «Переход» и «Останов».
В команде «Останов» разряды 5 – 12 не используются.
Таблица 10. Система команд ЭВМ F2
Код опер. |
Наименование
|
Признаки |
Выполнение команды |
|||
< |
= |
> |
нк |
|||
0000 |
Останов |
– |
– |
– |
– |
|
0001 |
Загрузка аккумулятора |
– |
– |
– |
– |
|
0010 |
Сохранение аккумулятора |
– |
– |
– |
– |
|
0011 |
Вызов подпрограммы |
– |
– |
– |
– |
|
0100 |
Возврат из подпрогр-ы |
– |
– |
– |
– |
|
0101 |
Переход |
– |
– |
– |
– |
См.описание |
0110 |
Сдвиг влево арифм. |
+ |
+ |
– |
– |
|
0111 |
Сдвиг вправо арифм. |
+ |
+ |
– |
– |
|
1000 |
Сложение |
+ |
+ |
+ |
+ |
|
1001 |
Вычитание |
+ |
+ |
+ |
+ |
|
1010 |
Умножение |
+ |
+ |
+ |
+ |
|
1011 |
Деление |
+ |
+ |
+ |
+ |
|
1100 |
Вычитание модулей |
+ |
+ |
– |
– |
|
1101 |
Сумма по модулю 2 |
+ |
+ |
– |
– |
|
1110 |
Конъюнкция |
+ |
+ |
– |
– |
|
1111 |
Дизъюнкция |
+ |
+ |
– |
– |
Круглые скобки в графе «Выполнение команды» означают содержимое регистра или ячейки памяти. Например, запись – это адрес ячейки, а () – содержимое ячейки с адресом .
10.2 Выполнение команд в ЭВМ F2
В ЭВМ F2 используются 12-разрядные числа с фиксированной запятой (целые числа со знаком). Отрицательные значения чисел записываются в дополнительном коде.
Выполнение команды начинается с загрузки содержимого команды в регистр RK. Для этого значение SAK передается в регистр RA, после чего содержимое ячейки ОЗУ, адрес которой задан в регистре RA, пересылается в регистр слова RS, а затем передается в RK. В регистре команды RK происходит выделение полей KOP, P и A, после чего дешифратор DC определяет тип операции. Для подготовки выборки следующей команды значение счетчика адреса SAK увеличивается на единицу.
В арифметико-логических командах на первый вход АЛУ поступает содержимое аккумулятора АС. Значение второго операнда выбирается из памяти, при этом в регистре RA устанавливается адрес по значениям полей Р и А регистра RK; содержимое ячейки ОЗУ по адресу, заданному в RA, через регистр RS поступает на второй вход АЛУ. Результат операции записывается в аккумулятор.
Далее по значению результата формируется содержимое регистра признаков RP. При выполнении арифметической операции первый бит RP устанавливается в «1», если ее результат отрицательный; второй бит устанавливается в «1» при нулевом результате этой операции; третий бит - при положительном результате; четвертый бит устанавливается в «1» в случае некорректности выполнения операции (переполнение аккумулятора АС или попытка деления на нуль).
Для логических операций и для команд сдвига производится лишь анализ результата на равенство нулю: RP[1] = 1, если результат операции не равен нулю; RP[2] = 1, если этот результат равен нулю.
Команды сдвига ориентированы только на аккумулятор. Особенностью арифметического сдвига, в отличие от логического, является то, что при сдвиге влево знаковый разряд не затрагивается, при этом освобождаемые в правой части аккумулятора разряды заполняются нулями; при сдвиге вправо разряд знака (0 или 1) распространяется на сдвигаемые разряды. Количество сдвигов определяется значением исполнительного адреса .
Если > 14, то сдвиг разрядов аккумулятора не выполняется; в этом случае по команде сдвига влево разряды 1..15 заполняются нулями, по команде сдвига вправо - значением разряда знака (0 или 1).
В команде «Загрузка аккумулятора» в АС передается содержимое ячейки памяти, адрес которой определен полями Р и А регистра RK.
По команде «Сохранение аккумулятора» содержимое АС через регистр RS записывается в ячейку ОЗУ по адресу, который определен значениями полей Р и А.
При выполнении команды «Вызов подпрограммы» в регистре RA устанавливается нулевое значение, содержимое счетчика SAK через регистр RS пересылается в нулевую ячейку ОЗУ, после чего в SAK загружается адрес из битов 5 – 12 регистра RK.
При выполнении команды «Возврат из подпрограммы» в регистре RA устанавливается нулевое значение и содержимое битов 5 – 12 нулевой ячейки ОЗУ через регистр RS поступает в счетчик адреса команд SAK.
Команда «Переход» структурно отличается от других команд ЭВМ F2. Поля этой команды располагаются в двух смежных ячейках ОЗУ. В первой ячейке используется лишь код операции (0101), поля Р и А в ней нулевые. Во второй команде первые 4 бита – маска команды, поля Р и А здесь, как и ранее, определяют адрес ячейки памяти . Команда «Переход» универсальна, она может задавать как условный, так и безусловный переход. Критерием типа перехода является результат логического умножения маски на содержимое регистра признаков RP. Если результат умножения ненулевой, то производится передача управления по адресу (адрес загружается в счетчик SAK), в противном случае производится переход к следующей команде. Примеры значений маски:
0000 - нет операции (пустая команда);
1000 – условный переход по «меньше» ((АС) < 0 для арифметической операции или (АС) <> 0 для логической операции);
0100 – условный переход по “равно” (результат операции равен нулю);
1010 – условный переход по “не равно” (результат арифметической операции меньше или больше нуля);
.............
1111 – безусловный переход.
Некоторой особенностью обладает рассматриваемая команда при значении маски МА = 1111. В этом случае логическое умножение маски на содержимое регистра признаков RP не производится и, следовательно, безусловный переход по адресу АМ выполняется при любом состоянии указанного регистра.
Значение маски, равное 0001, определяет переход по признаку некорректности. В этом случае, если RP[4]=1, необходимо по адресу перейти на вывод сообщения об аварийном прерывании, указав при этом код операции и адрес команды, вызвавшей прерывание, после чего произвести останов ЭВМ.
Пример.
k+0 0001 P1 < x >
k+1 1000 P1 < 0 >
k+2 0101 000 00000
k+3 1100 P1 k+7
k+4 1000 P1 < 1 >
k+5 0101 000 00000
k+6 1111 P1 k+13
k+7 0101 000 00000
k+8 0100 P1 k+12
k+9 1001 P1 < 1 >
k+10 0101 000 00000
k+11 1111 P1 k+13
k+12 0001 P1 < 0 >
k+13 0010 P1 < y >
k+14 0000 000 00000
k+15 0000 000 00000 0
k+16 0000 000 00001 1
k+17 x
k+18 y
Здесь k, k+1, … - условное обозначение адреса команды, < y > - обозначение адреса ячейки, отведенной для переменной y (в данном случае k+18); Р1 – условное обозначение адреса страницы.
При вычислении рассматриваемого выражения необходимо определить соотношение между значением переменной х и нулем, чтобы рассредоточить вычисления по трем ветвям. Для этого первая команда программы загружает переменную х в аккумулятор, но поскольку при этом не вырабатывается признак результата, то дальше производится сложение значения х с нулем. В ячейках с адресами k+2 и k+3 записана команда условного перехода по признакам “<” и “=”, а после нее к содержимому аккумулятора добавляется “1”, т.е. производится реализация первой ветви. Ячейки k+5 и k+6 – это команда безусловного перехода к команде с адресом k+13, выполняющей запись аккумулятора в ячейку, отведенную для переменной y.
В приведенной выше условной записи машинной программы k+0, k+1, k+2, … - это полные адреса ячеек, в которых размещаются машинные команды. В связи с этим можно считать, что в записи k+i отображен адрес страницы k и смещение i. Если принять , то получим ; для при этом будет иметь место P = 001,
Машинную программу, которая записана выше в условном виде, можно теперь изобразить следующим образом:
00100000 000100110001
00100001 100000101111
00100010 010100000000
00100011 110000100111
00100100 100000110000
00100101 010100000000
00100110 111100101101
00100111 010100000000
00101000 010000101100
00101001 100100110000
00101010 010100000000
00101011 111100101101
00101100 000100101111
00101101 001000110010
00101110 000000000000
00101111 000000000000
00110000 000000000000
00110001 101100011000
Здесь в левой колонке – адрес команды, в правой – машинная команда. Ячейка k+18, предназначенная для размещения переменной y, не показана в машинной программе, поскольку ее содержимое не нужно вводить извне.
В качестве примера реализации циклической программы рассмотрим вычисление выражения
При этом предполагается, что элементы массива Х расположены в смежных ячейках памяти.
Представим заданное выражение в виде
;
Тогда фрагмент программы может иметь следующий вид:
k+0 0001 P2 < 0 >
k+1 0010 P2 < R >
k+2 0001 P2 k1+4
k+3 0010 P1 k+8
k+4 0001 P2 < 5 >
k+6 0010 P2 < сч >
k+7 0001 P2 < R >
k+8 1000 P2 < >
k+9 0010 P2 < R >
k+10 0001 P1 k+8
k+11 1000 P2 < 1 >
k+12 0010 P1 k+8
k+13 0001 P2 < сч >
k+14 1001 P2 < 1 >
k+15 0010 P2 < сч >
k+16 0101 000 00000
k+17 0010 P1 k+7
k+18 0001 P2 < 8 >
k+19 1010 P2 < a >
k+20 1001 P2 < R >
k+21 0010 P2 < y >
k+22 0000 000 00000
k1+0 0000 000 00000 0
k1+1 0000 000 00001 1
k1+2 0000 000 00101 5
k1+3 0000 000 01000 8
k1+4 1000 P2 < x1 >
k1+5 a = 31
k1+6 x1 = 10
k1+7 x2 = -15
k1+8 x3 = 25
k1+9 x4 = 40
k1+10 x5 = 50
k1+11 y
k1+12 счетчик
k1+13 R
В этой программе команды и обрабатываемые данные расположены на двух различных страницах памяти, адреса ячеек которых условно обозначены k и k1, а номера страниц обозначены P1 и P2.
Накопление суммы производит команда сложения, имеющая адрес k+8. В каждом цикле адрес ее операнда должен увеличиваться на 1. Поскольку ЭВМ F2 не имеет индекс-адресации, то изменение команды k+8 выполняется принудительно (командами с адресами k+10, k+11 и k+12). До начала работы цикла команда k+8 восстанавливается, для чего используется ее прототип в ячейке k1+4.
Для контроля количества выполнений цикла используется счетчик в ячейке k1+10. До начала работы цикла счетчик получает исходное значение 5; в каждом цикле это значение уменьшается на 1. До тех пор, пока значение счетчика больше нуля, команда условной передачи управления выполняет переход на начало цикла – команду с адресом k+7, в противном случае осуществляется переход к следующей команде – команде останова.
Из мнемонических соображений изменяемый адрес в команде k+8 обозначен символом “*”, чтобы четко организовать модификацию и восстановление изменяемой команды.
Для ввода указанной информации в оперативную память ЭВМ F2 можно было бы использовать два текстовых файла – отдельно для машинной программы и для обрабатываемых данных. Однако это нецелесообразно с методической точки зрения. Для отладки эмулятора необходимо отработать несколько тестов, содержащих ограниченное количество функциональных параметров ЭВМ F2 (ограниченный набор машинных команд, различные методы адресации и т.п.). При использовании нескольких файлов для одного теста в Паскаль-программе эмулятора нужно было бы настраивать несколько процедур Assign на конкретные имена файлов и использовать несколько программ для ввода этих файлов. В этом смысле более предпочтительно каждый тест оформлять в виде одного текстового файла. При этом процедура ввода должна самостоятельно определять тип вводимой информации.
Структура текстового файла для ЭВМ F2 может быть следующей:
ПА пусковой-адрес-программы
НА начальный-адрес-программного-сегмента
машинные-команды
НА начальный-адрес-сегмента-данных
обрабатываемые-данные
Здесь ПА и НА – признаки пускового и начального адресов, причем значения этих адресов должны быть заданы в десятичной системе счисления. При этом нужно учесть, что пусковой адрес не всегда совпадает с начальным адресом программного сегмента. Это имеет место, например, в случае, когда в машинной программе вначале записана подпрограмма, а затем – основная программа. Если размер машинной программы превышает одну страницу (32 ячейки памяти), то ее следует размещать на смежных страницах. При этом значения адресов ПА и НА, относящиеся к программному сегменту, остаются неизменными.
Примем для программного сегмента ПА = НА = (P = 001, A = 00000) =, а для сегмента данных НА = (P = 100, A = 00000) = . Тогда рассматриваемая программа, подготовленная к записи в текстовый файл, будет иметь следующий вид (ПА, НА записаны в 10 с/с, машинные команды и данные – в 2 с/с и параллельно в 16 с/с):
ПА 32 ПА 32
НА 32 НА 32
000110000000 180
001010001101 28D
000110000100 184
001000101000 228
000110000010 182
001010001100 28C
000110001101 18D
100010000110 886
001010001101 28D
000100101000 128
100010000001 881
001000101000 228
000110001100 18C
100110000001 981
001010001100 28C
010100000000 500
001000100111 227
000110000011 183
101010000101 A85
100110001101 98D
001010001011 28B
000000000000 000
НА 128 НА 128
000000000000 000
000000000001 001
000000000101 005
000000001000 008
100010000110 886
000000011111 01F
000000001010 00A
111111110001 FF1
000000011001 019
000000101000 028
000000110010 032
Нетрудно заметить, что в машинных командах условное обозначение адреса операнда заменено смещением относительно базового адреса. Например, во второй машинной команде (k+1) в последних пяти разрядах вместо условного обозначения <R> записано смещение .
Примечание. В состав сегмента данных не включено содержимое ячеек <y>, <счетчик> и <R>, поскольку это содержимое формируется в программе, а не вводится извне.