Управление циклами: Команда BXL и BXH - Команда 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(R3) + (R1);

D2 + {B2)PC, если (Rl)(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(R1) + (R3); D2 + (B2)PC, если(Rl)(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 не выполняется до тех пор, пока значение индекса не совпадет со значением приращения.

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

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

 



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