Управление циклами: Команда BCT

{toc_noshowall}Значение циклов в организации любых вычислений настолько велико, что почти не существует ЭВМ, в которых не предусмотрены специальные команды, облегчающие программирование и повышающие эффективность выполнения циклов. Машины Систем 360 и 370 не являются исключением. Подобные команды и будут предметом дальнейшего изучения.

Предварительно рассмотрим общую структуру циклов.

 

На рис. 9.3 схематически изображена общая организация любых циклических вычислений. Несмотря на то что, вообще говоря, циклы могут быть организованы по-разному, большинство из них имеют приведенную структуру.

Шаг инициализации цикла состоит из нескольких команд, выполняющих такие действия, как, например, начальная установка счетчиков и значений адресных регистров. На этом шаге производится загрузка индекс-регистров, а также определение и запись в память конечных значений счетчиков и индексов.

Тело цикла соответствует шагу вычислений и содержит команды, обеспечивающие выполнение всех действий, которые следует циклически возобновлять. Расходящиеся в разные стороны стрелки на рис. 9.3 говорят о том, что выполнение цикла может быть прервано в зависимости от результатов работы до момента его нормального завершения. Шаг вычисления может сам включать несколько циклов, каждый из которых имеет изображенную на рис. 9.3 структуру.

На шаге приращения значение счетчика изменяется в соответствии с тем фактом, что цикл пройден в очередной раз. Это обычно означает, что некоторое значение (приращение) добавляется к содержимому счетчика, базового или индексного регистра. Вообще говоря, приращение может быть и отрицательным. В некоторых случаях начальное значение счетчика равно числу необходимых повторений. Оно уменьшается каждый раз при завершении выполнения вычислений. Шаг приращения может вообще отсутствовать, если проверка на выход из цикла выполняется в процессе самих вычислений.

Проверка завершения определяет необходимость выхода из цикла. В большинстве случаев на этом шаге текущее значение счетчика сравнивается с его конечным значением. Если конечное значение еще не Достигнуто, возобновляется выполнение вычислений. Если проверка на выход из цикла осуществляется внутри самих вычислений, то шаг проверки завершения вырождается в простой безусловный переход к началу цикла.

Рис. 9.3. Основные компоненты и структура цикла.

Цикл, структура которого изображена на рис. 9.3, в любом случае будет пройден по крайней мере один раз. Строго говоря, на этапе инициализации должно быть определено, нужно ли вообще что-либо выполнять. С этой целью можно также поместить проверку завершения перед телом цикла.

Команды управления циклами облегчают программирование циклов, имеющих описанную выше структуру. Они зачастую позволяют уменьшить число команд, выполняемых в цикле, и таким образом повысить эффективность программы в целом. Как правило, чем меньше команд в цикле, тем меньше время выполнения этого цикла и самой программы. Это увеличение скорости выполнения цикла может потребовать некоторых дополнительных затрат на программирование шага инициализации, а также использования дополнительных регистров.

 

Команда ВСТ (Branch on Count — ПЕРЕХОД ПО СЧЕТЧИКУ) может быть использована для организации циклов, в которых счетчик уменьшается на единицу от некоторого начального значения до 0 при каждом прохождении цикла. Другими словами, если мы хотим производить проверку завершения цикла с помощью ВСТ, нужно предварительно поместить в регистр-счетчик число, определяющее необходимое число повторений. Команда ВСТ в данном случае объединяет шаги приращения и проверки завершения.

BCT R1,D2(X2,B2)

Branch on CounT

R1(R1)— 1;

PCD2+(X2) + (B2), если (Rl)0

Выполнение команды ВСТ подразделяется на два шага. Сначала содержимое R1 уменьшается на 1. Затем, если результат вычитания не нулевой, производится переход по адресу, указанному вторым операндом. Если после вычитания (R1) = 0, выполняется следующая по порядку команда. Важно запомнить, что вычитание производится до проверки содержимого R1 и перехода. Выполнение команды ВСТ не оказывает влияния на признак результата.

ВСТ — это обычная команда формата RX. Действие ВСТ можно кратко описать так: она уменьшает счетчик циклов на 1 и производит переход на начало цикла, если результат не равен 0. Это значит, что выполнение команды

ВСТ 5,REPEAT

эквивалентно выполнению пары команд

S 5 = F'T

BNZ REPEAT

за исключением того, что ВСТ не вырабатывает признака результата.

На рис. 9.4 приведена программа, вычисляющая сумму 10 от- перфорированных на картах чисел. Значение суммы помещается в регистр 7. На рис. 9.5 приведена программа, выполняющая те же действия, но только в ней для уменьшения значения счетчика циклов и возврата к команде RWD, если еще не все числа сложены, используется команда ВСТ. Шаг инициализации одинаков в обеих программах; количество повторений записывается в регистр 3. В программе на Рис. 9.5, однако, шаги приращения и проверки завершения объединены и реализуются с помощью команды ВСТ.

Команда ВСТ применяется не только для организации циклов. Она может быть использована в любом случае, когда требуется вычесть 1 из содержимого регистра и произвести переход, если результат не равен 0. При использовании ВСТ для управления циклами нельзя, чтобы начальное содержимое регистра R1 было неположительным, так как в этом случае цикл будет выполняться бесконечно.

Рис. 9.4. Программа вычисления суммы 10 чисел, вводимых с перфокарт.

Рис. 9.5. Применение команды ВСТ для управления циклом.

Команда BCTR представляет собой вариант команды ВСТ формата RR. По команде BCTR содержимое R1 также уменьшается на 1, но в случае, когда в результате вычисления получается не 0, в счетчик команд заносится значение, находящееся в R2. Если после уменьшения на 1 (R1) = 0, то переход не происходит.

BCTR R1,R2

Branch on CounT to Register

(R1)(R1)— 1;

(R2)PC, если (Rl)0

Рис. 9.6. Применение команд BCTR для управления циклом.

Команда BCTR имеет обычный формат RR и ее выполнение не влияет на признак результата.

Рис. 9.6 иллюстрирует возможность применения команды BCTR для управления циклом. BCTR часто используется для вычитания 1 из содержимого некоторого регистра, так как если вместо R2 указать

0, переход не будет выполнен, даже если (R1) получится нулевым. Например, по команде

BCTR 11,0

содержимое регистра 11 будет уменьшено на 1, переход не будет выполнен. Время выполнения такой команды составляет всего две третьих времени выполнения команды

Рис. 9.6. Применение команд BCTR для управления циклом.

S 11, = FT

Кроме того, для размещения команды BCTR требуется меньше памяти и нет необходимости определять константу 1.

 
Статьи раздела