Учебное пособие для иностранных студентов (1110580), страница 5
Текст из файла (страница 5)
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 заменилось на переход на конец программы по отрицанию условия. Тело цикла заканчивается безусловным переходом на начало цикла.
П.2. Учебная двухадресная машина УМ-2.
Анализ большого числа программ показывает, что только 25% команд содержат три различных адреса. В остальных командах либо два, либо все три адреса совпадают. Этот факт наталкивает на идею отказаться от одного из адресов — сделать команды двухадресными. Тогда можно использовать освободившиеся разряды для задания более длинных адресов — появляется возможность адресовать бульший объем памяти. Либо можно сократить размер ячейки, сделав более дешевой оперативную память.
Как избавиться от третьего адреса? В УМ-3 существенно трехадресными были арифметические команды и команды условного перехода.
а) Арифметические команды. Договоримся, что результат записывается на место первого операнда (по адресу А1).
б) Команды условного перехода. Можно разбить команду на две, выделив в отдельную команду действие сравнения.
1. Описание УМ-2.
Структура процессора та же, что и в УМ-3; разрядность регистров соответствует разрядности ячейки и объему ОП.
Ячейка ОП — 10 шестнадцатиричных разрядов.
Объем ОП — 164 ячеек.
Представление чисел. Число занимает одну ячейку. Отрицательные числа записываются в дополнительном коде.
Формат команд. Команда занимает одну ячейку:
КОП А1 А2
Система команд. Коды операций те же, что в УМ-3. Отличия заключаются в следующем.
Команды | Действие |
Пересылка 00 А1 А2 | [А1] := [А2] |
Арифметические команды | [А1] := [А1] [А2], где {+, -, *} |
Деление | вычисляет частное и остаток от деления [А1] на [А2]; частное записывается в [А1], остаток в [А1+1] |
Сравнение 05 А1 А2 | вычисляется [А1] - [А2], устанавливаются арифметические флаги |
Условные переходы | переход по А2, если условие выполняется; А1 не используется |
Остальные команды те же, что в УМ-3.
2. Рассмотрим два примера программ для УМ-2.
Пример 1. Вычислить значение x= ( a mod 50 - b )2 по заданным a и b.
Распределение памяти:
0000 a
0001 x
0002 3216 (=5010)
0003 b
Программа:
0100 | 04 0000 0002 | x := a mod 50 |
0101 | 02 0001 0003 | x := x - b |
0102 | 03 0001 0001 | x := x * x |
0103 | 99 0000 0000 | стоп |
Пример 2. Вычислить p = n!.
Алгоритм:
begin p:=1; k:=2;
while k n do
begin p := p * k;
k := k + 1
end
end.
Распределение памяти:
0000 1
0001 2
0002 n
0003 p
0004 k.
Программа:
0100 | 00 0003 0000 | p := 1 |
0101 | 00 0004 0001 | k := 2 |
0102 | 05 0004 0002 | k n ? |
0103 | 95 0000 0107 | k > n, go to 0107 |
0104 | 13 0003 0004 | p := p * k |
0105 | 01 0004 0000 | k := k + 1 |
0106 | 80 0000 0102 | go to 0102 |
0107 | 99 0000 0000 | стоп |
П.3. Учебная машина с регистрами УМ-Р.
Вспомним, как выполняется арифметическая команда. Процессор обращается к ОП для получения операндов и для записи результата. Поскольку ОП внешнее по отношению к ЦП устройство, на это взаимодействие затрачивается бульшая часть времени выполнения команды. Кроме того, часто оказывается, что результат, полученный ЦП в предыдущей команде, требуется в качестве операнда для выполнения следующей команды. Принимая во внимание эти обстоятельства, имеет смысл включить в ЦП несколько ячеек памяти. Так как этих ячеек будет немного, можно сделать их более быстродействующими (и, видимо, более дорогими), чем ячейки ОП. Такие ячейки, расположенные в ЦП, называются регистрами. Программист может использовать эти регистры по своему желанию для хранения информации, в отличие от других регистров процессора. Поскольку регистров немного, для указания их в команде требуется меньше разрядов, чем для задания адресов ОП. Использование регистров позволяет сократить размер программ.
1. Описание УМ-Р.
Кроме обычных регистров, ЦП содержит 16 регистров общего назначения. Регистры нумеруются от 0 до F16. Размер регистров совпадает с разрядностью чисел.
Ячейка ОП состоит из четырех шестнадцатиричных разрядов.
Объем ОП — 165 ячеек.
Число занимает две соседние ячейки, отрицательные числа записываются в дополнительном коде.
Команды бывают двух типов.
а) Регистр-регистр. Занимает одну ячейку. Формат команды
КОП R1 R2,
где R1 — первый операнд, R2 — второй операнд.
б) Регистр-память. Занимает две ячейки. Формат команды
КОП R1 А2,
где R1 — первый операнд, A2 — адрес второго операнда.
Система команд следующая:
Название | КОП | Регистр-память | КОП | Регистр-регистр | |
останов | 99 | стоп | |||
пересылки | 00 | R1:=(A2,A2+1) | 20 | R1:=R2 | |
10 | R1(A2,A2+1) | ||||
арифметические | |||||
сложение | 01 | R1:=R1+(А2,A2+1) | 21 | R1:=R1+R2 | |
вычитание | 02 | R1:=R1-(А2,A2+1) | 22 | R1:=R1-R2 | |
умножение | |||||
со знаком | 03 | R1:=R1*(А2,A2+1) | 23 | R1:=R1*R2 | |
без знака | 13 | 33 | |||
деление | |||||
со знаком | 04 | R1:=R1 div (А2,A2+1), (R1+1):=R1 mod (А2,A2+1) | 24 | R1:=R1 div R2, (R1+1):=R1 mod R2 | |
без знака | 14 | 34 | |||
сравнение | 05 | R1-(А2,A2+1) | 25 | R1-R2 | |
переходы по А2 (типа регистр-память)(R1- любой) | |||||
безусловный | 80 | ||||
по = | 81 | ||||
по | 82 | ||||
по | с/зн - 83 | б/зн - 93 | |||
по | с/зн - 84 | б/зн - 94 | |||
по | с/зн - 85 | б/зн - 95 | |||
по | с/зн - 86 | б/зн - 96 |
2. Примеры.
Для удобства чтения программы будем записывать, располагая по одной команде на строке. Тот факт, что команды имеют разную длину, будем учитывать при подсчете адресов команд.
Пример 1. Вычислить значение x= ( a mod 50 - b )2 по заданным a и b.
Распределение памяти:
00000 a
00002 b
00004 3216 (=5010)
00006 x
Программа:
00100 | 00 0 00000 | R0 := a |
00102 | 04 0 00004 | R1 := a mod 50 |
00104 | 02 1 00002 | R1 := R1 - b |
00106 | 23 1 1 | R1 := R1 *R1 |
00107 | 10 1 00006 | x := R1 |
00109 | 99 0 0 | стоп |
Пример 2. Вычислить
S1 = max(a,b) * 20,
S2 = min(a,b) div 3.
Алгоритм:
begin S1 := a; S2 := b;
if a > b then begin S1 := b; S2 := a end;