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

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

Для решения более общих задач управления циклами используются команды BXLE и ВХН.

Команда BXLE

BXLE — первая команда формата RS, с которой мы познакомимся. Перед ее подробным рассмотрением напомним, что команды формата RS имеют три операнда. Два из них — регистры, третий находится в памяти.

BXLE является сокращением от Branch on Index Low or Equal (ПЕРЕХОД ПО ИНДЕКСУ МЕНЬШЕ ИЛИ РАВНО). Команда осуществляет управление циклами с помощью проверки и модификации содержимого регистров, используемых в качестве индексных. Вот общий видBXLE:

BXLE R1,R3,D2(B2)

По причинам, которые будут отмечены позже, третий операнд (R3) указан на месте второго. Исходя из приведенной формы, можно сказать, что первые два операнда представляют собой регистры общего назначения. В качестве третьего операнда выступает адрес S-типа, вместо которого можно указывать перемещаемое имя или выражение. По адресу, указываемому в качестве операнда, производится передача управления в случае выполнения условий перехода.

В большинстве случаев команда BXLE используется для объединения шагов приращения и проверки завершения. Рассмотрим пример работы с этой командой.

Пусть первоначально

(8)=00000020

(6)=00000004

(7)=00000028

и выполняется команда

BXLE 8,6,REPEAT

Процесс выполнения распадается на три этапа. Сначала содержимое регистра, указанного на месте второго операнда, в данном случае регистра 6, складывается с содержимым регистра первого операнда. В результате получается

(8)=00000024

Затем новое содержимое регистра 8 сравнивается с содержимым регистра, следующего за указанным в качестве второго операнда, регистром 6. Таким образом, в данном случае сравнивается содержимое регистров 8 и 7. (8)<(7), и, поскольку в результате сравнения выполняется условие «меньше, чем», адрес REPEAT засылается в счетчик команд, вызывая переход по метке REPEAT.

Выполнение команды BXLE из приведенного примера эквивалентно выполнению трех команд:

А 8, = F'4' (или LA 8,4(8), или АН 8, = Н'4')

CR 8,7

BNP REPEAT

При следующем выполнении BXLE получится

(8)=00000028

Теперь (8) = (7), и переход на REPEAT снова происходит. Однако после еще одного выполнения команды получим

(8)=0000002С

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

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

При общем описании BXLE необходимо учесть два возможных случая. В рассмотренном примере R3 является регистром с четным номером (регистр 6). Если R3 — четный регистр, то действие BXLE сводится к следующему:

BXLE

(R3—четный)

R1,R3,D2(B2)

Branch on indeX Low or Equal

R1Статья 387 - Картинка 1(R3) + (R1);

D2 + {B2)Статья 387 - Картинка 2PC, если (Rl)Статья 387 - Картинка 3(R3 + 1)


Символическую запись можно проинтерпретировать так: содержимое второго регистрового операнда (R3) складывается с содержимым первого, (R1). Если вычисленная сумма меньше содержимого регистра R3+1 или равна ему, то производится передача управления по адресу D2+(B2). Если сумма больше, чем (R3+1), то выполняется следующая по порядку команда. Команда BXLE не влияет на признак результата.

Если R3 — регистр с нечетным номером, то команда выполняется несколько иначе. (R3) по-прежнему складывается с (R1). Но сумма сравнивается не с (R3+1), а с (R3).

BXLE

(R3—нечетный)

R1,R3,D2(B2)

Branch on indeX Low or Equal

R1Статья 387 - Картинка 4(R1) + (R3); D2 + (B2)Статья 387 - Картинка 5PC, если(Rl)Статья 387 - Картинка 6(R3)

Использование команды BXLE требует выполнения некоторых дополнительных действий на шаге инициализации. Начальное значение счетчика циклов или индекса должно быть загружено в регистр. Если R3 имеет четный номер, то в него предварительно должно быть помещено значение приращения, а конечное значение счетчика — в R3+1. Если номер R3 — нечетный, то приращение совпадает с конечным значением, это число должно быть загружено в R3.

На рис. 9.7 приведена программа, отыскивающая минимальное число из некоторой группы чисел. Блок-схема этой программы была приведена на рис. 9.1.

На шаге инициализации в регистр 3, который впоследствии будет использоваться в качестве индексного, помещается начальное значение индекса, равное 2. В регистр 4 мы засылаем приращение, равное 2, так как предстоит обработка последовательности индексов. Наконец, конечное значение индекса, в данном случае 28, помещается в следующий за 4-м, т. е. в 5-й регистр. Шаги приращения и проверки завершения выполняются по команде

BXLE 3,4,CHECKER

Сравните программы, представленные на рис. 9.7 и 9.2, с точки зрения эффективности. Команда BXLE заменяет три команды:

LA 3,2(3)

CR 3,5

BCR В'1101',10

потребует выполнения команды LA вне цикла. Кроме того, в программе на рис. 9.7 используется дополнительный регистр, а именно регистр 4.

Если в команде BXLE регистр R3 — нечетный, это значит, что предполагается совпадение приращения и конечного значения индекса. BXLE с таким R3 можно использовать в том случае, когда шаги приращения и проверки завершения выполняются до фактических вычислений тела цикла. На рис. 9.8 приведен пример подобного использования команды BXLE в программе, определяющей минимальное из 15 чисел. Значение индекса в данном случае устанавливается так, что при первом выполнении цикла будет исследоваться второе от конца полуслово. Переход на завершение по команде BXLE не выполняется до тех пор, пока значение индекса не совпадет со значением приращения.

Статья 387 - Картинка 7

Рис. 9.7. Применение команды BXLE для управления циклом. Программа нахождения наименьшего из 15 чисел, записанных в последовательных полусловах, начиная с адреса DATA.

Статья 387 - Картинка 8

Рис. 9.8. Применение команды BXLE с нечетным R3.

Команда BXH

Команда ВХН (Branch on Index High — ПЕРЕХОД ПО ИНДЕКСУ БОЛЬШЕ) выполняется так же, как BXLE, только переход на S2 осуществляется, если в результате сложения (R1) и (R3) получится число, большее, чем (R3+1), если номер R3 — четный, и большее, чем (R3),если номер R3 — нечетный. По команде же BXLE переход выполняется, если вычисленная в R1 сумма не превышает (R3+1) или (R3).

Статья 387 - Картинка 9

Рис. 9.9. Применение команды ВХН для управления циклом. Программа нахождения наименьшего из чисел, записанных в последовательных полусловах, начиная с адреса DATA.

BXH

(R3—четный)

R1,R3,D2(B2)

Branch on index High

RlСтатья 387 - Картинка 10(R3) + (R1); D2 + (B2)Статья 387 - Картинка 11PC, если(Rl) > (R3+1)

ВХН

(R3—нечетный)

Rl,R3,D2(B2)

Branch on index High

RlСтатья 387 - Картинка 12(R3) + (R1); D2 + (B2)Статья 387 - Картинка 13PC, если(R1) > (R3)

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

Например, в программе, представленной на рис. 9.7, мы начинаем перебор чисел, расположенных в памяти последовательно в поле DATA, с первого; при этом индекс пробегает значение от 2 до 28. Можно было бы поступить наоборот; сначала заслать 28 в регистр 3, и затем каждый раз при прохождении цикла уменьшать его содержимое на 2, пока оно не станет равным 0. На рис. 9.9 представлена программа, в которой выполнение цикла организовано таким образом.