Без знаков
133
Ячейка памяти | Команда на машинном языке | Команда в символической форме | Комментарий |
LRI 1 | Установка в регистрах Н и L адреса | ||
первого числа | |||
LRI 2 | |||
LRI 3 | Установка начального значения | ||
0А | 0А | счетчика цикла равным 10 | |
LRI 4 | Установка частной суммы равной 0 | ||
LRI 5 | Загрузка константы 1 для | ||
уменьшения счетчика | |||
000А | MOV 0 from 4 | Прибавление очередного числа | |
000В | 8F | ADD F | |
000С | MOV 0 to 4 | ||
000D | F5 | IHL | Увеличение Н и L |
000Е | MOV 0 from 3 | Уменьшение счетчика | |
000F | А5 | SUB 5 | |
MOV 0 to 3 | |||
7D | JAN | Проверка конца цикла | |
0А | 0A | ||
FA | HLT | ||
ЧИСЛО1 | Суммируемые числа | ||
ЧИСЛО2 * | |||
. . . | . . . | ||
001Е | ЧИСЛ010 |
Суммируется содержимое последовательных ячеек. Первые пять команд составляют инициализирующую часть. Общие регистры Н и L используются в качестве 16-битового указателя, содержащего адрес очередного прибавляемого числа.
Первые две команды заносят в Н и L адрес первого числа. Затем в регистр 3 помещается начальное значение, равное 10. Регистр 3 будет выполнять функции счетчика количества суммируемых чисел, которые программе еще предстоит обработать. Сумма накапливается в общем регистре 4. Четвертая команда в программе устанавливает в нем нулевое начальное значение. Наконец, в общий регистр 5 загружается константа 1, которая будет вычитаться из счетчика в процессе суммирования чисел.
Следующие три команды составляют рабочую часть цикла. Сначала текущая частная сумма передается в аккумулятор из регистра 4. Далее следует команда сложения ADD F, содержащая специальный указатель F, который на самом деле соответствует ячейке главной памяти с адресом в паре регистров Н и L. Содержимое этой ячейки прибавляется к частной сумме в аккумуляторе. После этого результат передается в общий регистр 4.
Остальные команды программы служат для тестирования конца цикла и модификации. Сначала команда IHL модифицирует регистры Н и L, так, чтобы они содержали адрес данных, которые должны обрабатываться при следующей итерации. Затем содержимое счетчика цикла передается в аккумулятор, уменьшается на 1 и снова возвращается в регистр 3. Поскольку значение счетчика осталось также в аккумуляторе, его можно использовать для проверки, нужно ли продолжать итерации или вычисления завершены. Счетчик показывает число еще не прибавленных чисел. Следовательно, когда вычисления завершаются, в аккумуляторе будет 0. Это условие тестируется командой «условный переход при ненулевом аккумуляторе». Если в аккумуляторе 0, тогда переход не происходит, и программа выходит на команду останова, в противном случае выполняется следующая итерация.
Обратите внимание, в описанной программе по команде ADD F вполне можно получить сумму, превышающую емкость аккумулятора, т. е. частная сумма может занять 9 разрядов. Это и есть переполнение, о котором мы уже упоминали. Ясно, что если переполнение может возникнуть, то оно должно детектироваться (в рассматриваемом случае при переполнении после выполнения команды ADD F окажется установленным в 1 триггер переноса), и нужно иметь возможность работать с суммами, занимающими более 1 байта. Обычно в подобных задачах применяется процедура сложения «с двойной», «тройной» или большей «точностью».