Ранее мы рассмотрели общие принципы построения ЭВМ. В данном параграфе мы разберем 4 учебные вычислительные машины. Эти машины называются учебными, потому что они не существуют на самом деле. Однако они помогут нам представить работу реальных ЭВМ, разобрать некоторые проблемы, возникающие при построении ЭВМ, и способы решения этих проблем.
Для записи содержимого ячеек будем пользоваться шестнадцатиричными цифрами.
П.1. Учебная трехадресная машина УМ-3.
1. Структура процессора.
Кроме тех регистров, которые мы обсуждали в §2, в арифметическом устройстве УМ-3 имеются регистры первого операнда ОП1, второго операнда ОП2 и результата РЕЗ.
2. Оперативная память.
Ячейка - 14 шестнадцатиричных разрядов.
Объем ОП - 164 ячеек с адресами 0000FFFF.
Представление чисел: число содержится в одной ячейке; отрицательные числа записываются в дополнительном коде.
Представление команд: команда занимает одну ячейку. Разряды ячейки имеют следующий смысл (формат команд):
-
КОП А1 А2 А3
Здесь КОП – код операции (указывает, какую машинную операцию надо выполнить); А1, А2, А3 – адреса первого, второго операндов и результата. Разрядность адресов совпадает с разрядностью регистра СА и определяется объемом ОП (а именно, количеством возможных адресов). Количество разрядов в регистрах ОП1, ОП2, РЕЗ и РК должно совпадать с количеством разрядов ячейки ОП, так как в ОП1, ОП2 и РЕЗ должны поместиться числа, а в РК – команда, которые занимают по одной ячейке ОП.
3. Система команд УМ-3.
Система команд ЭВМ – это набор всех машинных команд данной ЭВМ.
Название
|
КОП
|
Операция
|
Примечание
|
останов
|
99
|
стоп
|
А1,А2,А3 - любые
|
пересылка
|
00
|
[А1] [А3]
|
А2 - любой
|
|
|
арифметические
|
|
сложение
|
01
|
[А1]+[А2] [А3]
|
Устанавливаются
|
вычитание
|
02
|
[А1]-[А2] [А3]
|
арифметические флаги
|
умножение
|
|
|
|
со знаком
|
03
|
[А1]*[А2] [А3]
|
|
без знака
|
13
|
|
|
деление
|
|
|
|
со знаком
|
04
|
[А1] div [А2] [А3], [А1] mod [А2] [А3+1]
|
без знака
|
14
|
|
|
|
|
переходы
|
|
безусловный
|
80
|
перейти к А3
|
А1,А2 - любые
|
условные
|
|
|
После выполнения
|
по =
|
81
|
при [А1]=[А2]
перейти к А3
|
команды перехода работа продолжается
|
по
|
82
|
при [А1][А2]
перейти к А3
|
с команды, записанной в ячейке с адресом A3
|
по
|
с/зн - 83 б/зн - 93
|
при [А1][А2] перейти к А3
|
по
|
с/зн - 84 б/зн - 94
|
при [А1] [А2] перейти к А3
|
по
|
с/зн - 85 б/зн - 95
|
при [А1][А2] перейти к А3
|
по
|
с/зн - 86 б/зн - 96
|
при [А1] [А2] перейти к А3
|
В таблице использовано обозначение [A] – содержимое ячейки с адресом A.
Арифметические команды выполняются следующим образом: содержимое ячеек с адресами A1 и A2 пересылается в регистры ОП1 и ОП2, выполняется арифметическая операция (результат – в регистре РЕЗ), содержимое регистра РЕЗ пересылается в ячейку с адресом А3. Следует обратить внимание на то, что есть две команды умножения и две команды деления. Программист использует подходящую команду в зависимости от того, с какими данными (числами со знаком или без знака) должна работать программа. Команда деления дает два результата – частное и остаток. Они записываются в соседние ячейки: частное – по адресу А3, остаток – в ячейку с адресом А3+1.
Действие команд перехода заключается в изменении содержимого регистра СА. При этом на следующем такте работы ЦП будет выполнять команду, записанную в ячейке с адресом А3. (Вспомните §2.)
В командах условного перехода производится проверка соответствующего условия. Если условие выполняется, тогда в СА записывается адрес А3. Сравнение значений [ А1] и [А2] выполняется так: в ОП1 записывается [А1], в ОП2 – [А2]; выполняется вычитание ОП1-ОП2, при этом получают значение все четыре арифметических флажка. По значениям флагов и определяется истинность условия. Некоторым условиям (например,<) соответствуют разные наборы значений флагов для разных данных – чисел со знаком и чисел без знака. Поэтому команды переходов для чисел со знаком и чисел без знака разные.
Рассмотрим на примерах соответствие между условиями и значениями флагов.
1) Переход по равенству. В результате вычитания [А1] - [А2] получится ZF=1 тогда и только тогда, когда [А1] = [А2].
2) Переход по "меньше", числа без знака.
[А1] < [А2] [А1] - [А2] < 0 CF=1.
3) Переход по "меньше", числа со знаком. Если вычитаются числа со знаком, то при [А1] < [А2], [А1] - [А2] < 0, возможны ситуации
а) результат вычислили правильно (OF=0) и он оказался отрицательным , значение SF=1,
б) результат вычислили неправильно (OF=1), при этом знак вычисленного значения противоречит знаку числа [А1] - [А2], вычисленный результат оказался положительным, то есть SF=0.
Таким образом, для чисел со знаком
[А1] < [А2] [А1] - [А2] < 0 (OF=1) and (SF=0) or (OF=0) and (SF=1), или более коротко OF SF. При выполнении команды перехода по "меньше" для чисел со знаком процессор проверяет выполнимость условия OF SF.
4. Разберем теперь несколько примеров программ для УМ-3. Условимся, что перед началом работы
1) в СА записывается 0100, то есть выполнение начинается с команды по адресу 0100,
2) в ячейки ОП уже записаны все данные, необходимые для работы программ (ввод и вывод не рассматриваем).
Пример 1. Вычислить значение x= ( a mod 50 - b )2 по заданным a и b.
Поскольку в выражении есть операция вычитания, лучше работать с числами со знаком. Пусть данные располагаются в следующих ячейках
-
Адрес
|
Содержимое
|
0000
|
a
|
0001
|
3216 (=5010)
|
0002
|
b
|
0003
|
x
|
0004
|
рабочая (потребуется для деления)
|
Программа.
-
Адрес
|
Содержимое ячейки
|
Комментарий
|
0100
|
04 0000 0001 0003
|
a mod 50 [0004]
|
0101
|
02 0004 0002 0003
|
[0004] - b x
|
0102
|
03 0003 0003 0003
|
xx x
|
0103
|
99 0000 0000 0000
|
стоп
|
Напомним, что деление даёт два результата, поэтому первая команда программы записывает в [0003] x div 50 (это значение в дальнейшем не используется) и в [0004] a mod 50.
Пример 2. Вычислить
S1 = max(a,b) * 20,
S2 = min(a,b) div 3.
Вычисления организуем так:
begin if a < b then begin S1 := b; S2 := a end
else begin S1 := a; S2 := b end;
S1 := S1 * 20;
S2 := S2 div 3
end.
Данные:
0000 a
0001 b
0002 1416 (=2010)
0003 3
0004 S1
0005 S2
0006 рабочая.
Будем считать, что работаем с числами без знака.
Программа:
-
Адрес
|
Содержимое ячейки
|
Комментарий
|
|
0100
|
94 0000 0001 0104
|
if ab, go to 0104
|
|
0101
|
00 0001 0000 0004
|
S1 := b
|
часть
|
0102
|
00 0000 0000 0005
|
S2 := a
|
then
|
0103
|
80 0000 0000 0106
|
go to 0106
|
|
0104
|
00 0000 0000 0004
|
S1 := a
|
часть
|
0105
|
00 0001 0000 0005
|
S2 := b
|
else
|
0106
|
13 0004 0002 0004
|
S1 := S1 * 20
|
|
0107
|
14 0005 0003 0005
|
S2 := S2 div 3
|
|
0108
|
99 0000 0000 0000
|
стоп
|
|
Пример 3. Вычислить p = n!.
Алгоритм:
begin p:=1; k:=2;
while k n do
begin p := p * k;
k := k + 1
end
end.
В этой задаче могут возникнуть довольно большие положительные числа, поэтому будем работать с числами без знака.
Данные:
0000 n
0001 1
0002 2
0003 p
0004 k
Программа:
-
0100
|
00 0001 0000 0003
|
p :=1
|
0101
|
00 0002 0000 0004
|
k := 2
|
0102
|
95 0004 0000 0106
|
if k > n, go to 0106
|
0103
|
13 0003 0004 0003
|
p := p * k
|
0104
|
01 0004 0001 0004
|
k := k + 1
|
0105
|
80 0000 0000 0102
|
go to 0102
|
0106
|
99 0000 0000 0000
|
стоп
|
Заметим, что в машинной программе начало цикла while k n do заменилось на переход на конец программы по отрицанию условия. Тело цикла заканчивается безусловным переходом на начало цикла.
Достарыңызбен бөлісу: |