П.4. Учебная машина с модификацией адресов УМ-М.
В программировании большое количество задач связано с обработкой массивов. Поэтому желательно сделать работу с массивами удобной. Решается эта проблема с помощью механизма модификации адресов. Суть этого механизма состоит в следующем. В команде кроме адреса операнда указывается регистр-модификатор. При выполнении команды процессор вычисляет сначала исполнительный адрес как сумму адреса, указанного в команде, и содержимого регистра-модификатора. Затем из ячейки с полученным адресом берется операнд. Изменив содержимое модификатора, мы заставляем процессор использовать другой адрес операнда. Подчеркнем, что действие по вычислению исполнительного адреса выполняется аппаратно, это дает преимущество в скорости по сравнению с самомодифицирующимся кодом (пример 4 из предыдущего пункта). Кроме того, текст программы остается всегда одним и тем же, так как изменение адреса получается за счет изменения содержимого регистра-модификатора. Это повышает надежность программ.
1. Описание учебной машины с модификацией адресов.
Машина УМ-М отличается от УМ-Р в следующем.
1) Объем ОП 164 ячеек.
2) Формат команд регистр-память
-
КОП R1 M2 А2
M2 — регистр, используемый для модификации адреса A2. Это может быть любой регистр общего назначения, кроме R0
3) При выполнении команд регистр-память процессор вычисляет исполнительный адрес по правилу
Второй операнд берется из ячейки с адресом Аисп.
Пример 1. Вычислить сумму элементов массива x1, ..., x20..
S = x1 + x2 +...+ x20
Распределение памяти:
|
Используемые регистры:
|
0000 x1
|
R0 0
|
0002 x2
|
R1 1
|
* * *
|
R2 2
|
0026 x20
|
R3 21
|
0028 S
|
R4 i
|
002A 0
|
R5 S
|
002C 1
|
R6 модификатор
|
002E 1516 (=2110)
|
|
0030 2
|
|
Программа:
-
0100
|
00 0 0 002A
|
R0 := 0
|
загрузка
|
0102
|
00 1 0 002C
|
R1 := 1
|
константных
|
0104
|
00 2 0 0030
|
R2 := 2
|
регистров
|
0106
|
00 3 0 002E
|
R3 := 21
|
|
0108
|
20 6 0
|
R6 := 0
|
|
0109
|
20 5 0
|
S := 0
|
|
010A
|
20 4 1
|
i := 1
|
|
010B
|
01 5 6 0000
|
S := S + x [R6]
|
|
010D
|
21 6 2
|
R6 := R6 + 2
|
|
010E
|
21 4 1
|
i := i + 1
|
|
010F
|
25 4 3
|
i = 21?
|
|
0110
|
82 0 0 010B
|
i 21, go to 0010B
|
|
0112
|
10 5 0 0028
|
сохранили S
|
|
0114
|
99 0 0
|
стоп
|
|
В этой программе модификация адресов происходит только в одной команде 010B. Отметим, что во время работы программы модификатор R6 принимает значения 0, 2,4,...Значение R6 увеличивается на 2 на каждом шаге цикла, так как элементы массива занимают по две ячейки.
Можно использовать модификатор R6 для управления циклом. Тогда не потребуются команды, работающие с переменной i .
Пример 2. Вычислить сумму элементов массива x1, ..., x20..
S = x1 + x2 +...+ x20
Распределение памяти:
|
Регистры:
|
0000 0
|
|
0002 x1
|
|
0004 x2
|
R2 2
|
* * *
|
R3 38
|
0026 x20
|
R5 S
|
0028 S
|
R6 модификатор
|
002А 2616 (=3810)
|
|
002С 2
|
|
Программа:
-
0100
|
00 2 0 002E
|
R2 := 2
|
0102
|
00 3 0 002C
|
R3 := 38
|
0104
|
20 6 3
|
R6 := 38 адрес последнего элемента
|
0105
|
00 5 0 002A
|
S := 0
|
0107
|
01 5 6 0000
|
S := S + x [R6]
|
0109
|
22 6 2
|
R6 := R6 - 2
|
010A
|
82 0 0 0107
|
R6 0, go to 00107
|
010C
|
10 5 0 0028
|
сохранили S
|
010E
|
99 0 0
|
стоп
|
В этой программе элементы массива просматриваются, начиная с последнего. Поэтому начальное значение R6 — адрес последнего элемента. Для получения адреса предыдущего элемента из R6 вычитается 2 на каждом шаге цикла. После завершения выполнения программы значение R6 вышло за рамки массива и указывает на 0000.
При выполнении перехода по "не равно" процессор проверяет значение флага ZF (материал п1 §4). Команда 0109: 22 6 2 (R6 := R6 - 2) устанавливает такое же значение флага ZF, что и последовательность команд
22 6 2 (R6 := R6 - 2)
25 6 0 (R6 := 0).
В самом деле, числа (R6 - 2) и ((R6 - 2) - 0) могут равняться нулю только одновременно.
Следовательно, команду сравнения можно опустить.
Достарыңызбен бөлісу: |