При решении задач, связанных с обработкой массивов, возникает необходимость изменения исполнительного адреса при повторном выполнении некоторых команд. Эта задача может быть решена путем использования косвенной адресации. ## Пример Разработать программу вычисления суммы элементов массива чисел $C_1 ,C_2 , ..., C_n$. Исходными данными в этой задаче являются: $n$ - количество суммируемых чисел и $C_1, C_2, ..., C_n$ - массив суммируемых чисел. Заметим, что должно выполняться условие n > 1, т. к. алгоритм предусматривает, по крайней мере, одно суммирование. Кроме того, предполагается, что суммируемые числа записаны в ОЗУ подряд, т. е. в ячейки памяти с последовательными адресами. Результатом является сумма $S$. ![Граф-схема алгоритма для примера](../../Pictures/ЛБ05_01.%20Граф-схема%20алгоритма%20для%20примера.png) Составим программу для вычисления суммы со следующими конкретными параметрами: число элементов массива - 10, элементы массива расположены в ячейках ОЗУ по адресам 040, 041, 042, ..., 049. Используемые для решения задачи промежуточные переменные имеют следующий смысл: $A_i$ - адрес числа $C_i , i(1, 2, ...,10)$; ОЗУ($A_i$) - число по адресу $Ai$, $S$ - текущая сумма; $k$ - счетчик цикла, определяющий число повторений тела цикла. Распределение памяти таково. Программу разместим в ячейках ОЗУ, начиная с адреса 000, примерная оценка объема программы - 20 команд; промежуточные переменные: $A_i$ - в ячейке ОЗУ с адресом 030, $k$ - по адресу 031, $S$ - по адресу 032. | Адрес | Команда | Примечание | | ----- | ----------- | ---------------------------------------------- | | 000 | `RD #40` | Загрузка начального адреса массива 040 | | 001 | `WR 30` | в ячейку 030 | | 002 | `RD #10` | Загрузка параметра цикла $k$ = 10 в ячейку 031 | | 003 | `WR 31` | | | 004 | `RD #0` | Загрузка начального значения суммы $S$ = 0 | | 005 | `WR 32` | в ячейку 032 | | 006 | `M1: RD 32` | Добавление | | 007 | `ADD @30` | к текущей сумме | | 008 | `WR 32` | очередного элемента массива | | 009 | `RD30` | Модификация текущего | | 010 | `ADD #1` | адреса массива | | 011 | `WR 30` | (переход к следующему адресу) | | 012 | `RD 31` | Уменьшение счетчика | | 013 | `SUB #1` | (параметра цикла) | | 014 | `WR 31` | на 1 | | 015 | `JNZ M1` | Проверка параметра цикла и переход при $k$ ≠ 0 | | 016 | `RD 32` | Вывод | | 017 | `OUT` | результата | | 018 | `HLT` | Стоп | ## Задание 1. Написать программу определения заданной характеристики последовательности чисел $C_1, C_2, ..., C_n$. 2. Записать программу в мнемокодах, введя ее в поле окна Текст программы. 3. Сохранить набранную программу в виде текстового файла и произвести ассемблирование мнемокодов. 4. Загрузить в ОЗУ необходимые константы и исходные данные. 5. Отладить программу. #### Вариант | Номер варианта | Характеристика последовательности чисел $C_1, C_2, ..., C_n$ | | -------------- | ------------------------------------------------------------ | | 12 | Количество чисел, меньших $C_1$ |