Команды перехода

{toc_noshowall}Несмотря на то что мы ввели несколько команд для выполнения условного перехода, на самом деле существует всего лишь одна. Все известные нам на настоящий момент команды являются фактически лишь формами записи команды ВС (Branch on Condition—УСЛОВНЫЙ ПЕРЕХОД) формата RX. Такие расширенные мнемоники, как В, BZ, BNM, транслируются ассемблером в машинную форму команды ВС; при этом попутно в формат команды вносится информация о том, какому состоянию признака результата соответствует действительный переход.

Состояние признака результата, которому соответствует переход, должно быть известно CPU при выполнении команд условной передачи управления. Информация об этом состоянии предоставляется процессору в виде маски. Вообще говоря, маска — это двоичное число, определяющее, какие из возможных логических решений должны быть приняты. Можно представить себе маску как набор переключателей. Если переключатель находится во включенном состоянии — соответствующий разряд маски содержит 1, то решение, соответствующее этому биту, должно быть принято. Если переключатель поставлен в положение «выключено» (разряд маски содержит 0), то выполнения соответствующих действий не требуется.

Одним из операндов команды ВС является 4-битовая маска. Мы можем считать, что разряды маски перенумерованы от 0 до 3. Каждый бит маски соответствует одному из четырех возможных состояний признака результата:

По маске определяется, какие значения признака результата вызывают выполнение перехода. Например, если при выполнении команды ВС 2-й разряд маски содержит 1, то переход будет выполнен, если признак результата имеет значение 2. Если данный бит содержитО, то наличие соответствующего признака результата не вызовет перехода.

Рассмотрим команду ВС с маской 01002. Так как бит 1 установлен в 1, то передача управления произойдет, если признак результата равен 012. Биты 0, 2 и 3 — нули, поэтому при значениях 0, 2 или 3 признака результата переход не будет иметь места. Так как код 1 признака результата соответствует отрицательному результату операции, команда ВС с такой маской эквивалентна описанной ранее команде ВМ.

Если несколько битов маски содержат 1, переход осуществляется, если выполнено хотя бы одно из соответствующих условий. Если маска содержит 10112, то переход осуществится, если признак результата будет иметь одно из значений 0, 2 или 3, но не 1. Команде ВС с такой маской отвечает расширенная мнемоника BNM.

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

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

Таким образом, маска является связующим звеном между программистом и машиной. С ее помощью программист указывает условия, при выполнении которых он желал бы выполнить переход. Для задания этих условий используются расширенные мнемоники, транслируемые ассемблером в команды ВС с требуемой маской. Можно также задавать маску непосредственно, как мы увидим в следующем разделе.

 

 

Команда ВС представляет собой команду модифицированного формата RX. Мы уже отмечали, что 4-битовая маска, указывающая в каких случаях следует осуществить переход, должна быть задана в качестве одного из операндов. Символически эта маска обозначается Mlи помещается на место поля R1 команды обычного формата RX. Итак, команду ВС можно описать так:

ВС Ml ,D2(X2,B2)

Branch on Condition

PCD2 + (X2)+(B2), если признак результата соответствует значению в поле M1

Отметим, что мы использовали явную форму указания адреса памяти, на который следует передать управление, задав смещение D2, базовый и индексный регистры В2 и Х2. В будущем при указании операндов, хранящихся в памяти, мы будем употреблять лишь явную форму. Имейте в виду, что там, где использована явная спецификация, может быть применена и неявная, путем задания символического имени и выражения. Например, команда ВС может иметь и такой вид:

ВС M1,S2(X2)

Поскольку, если нет специальных оговорок, ассемблер рассматривает все числа как десятичные, маску можно определять десятичным числом от 0 до 15 включительно. Для определения, что именно нужно написать в поле Ml, двоичное значение маски следует перевести в десятичную форму. Если мы хотим, например, задать маску 1 ООО2, указывая тем самым, что переход необходимо осуществлять, если признак результата равен 0, нужно написать

ВС 8, LOOP

(переход при этом будет осуществляться на команду с меткой LOOP). Если же нам требуется передать управление по адресу LOOP независимо от значения признака результата, то в качестве маски нужно задать

1111,=1510

и команда примет вид

ВС 15, LOOP

Перевод маски в десятичную форму, несмотря на свою простоту, часто является источником дополнительных ошибок. Ассемблер позволяет задавать числа в различных системах. В данном случае, как и в некоторых других, можно использовать системы с иными основаниями.

Для определения двоичной константы достаточно написать

В'значение'

«Значение» — это двоичное число, заключенное в одиночные кавычки. Символ В сообщает ассемблеру, что основанием используемой системы является число 2.

Шестнадцатеричная константа задается так

X'значение'

При необходимости эти возможности можно использовать для определения числовых констант. Например, следующие команды эквивалентны:

ВС 13,LOOP

ВС В'1101',LOOP

ВС X'D',LOOP

BNP LOOP

Машинный формат команды ВС ничем не отличается от обычного формата RX, лишь на месте первого операнда указывается маска. Команда ВС всего одна, кодом соответствующей операции является 47, поэтому в машинной форме

ВС M1,D2(X2,B2)

выглядит так:

Вам должен быть знаком этот вид: последние 2 бита представляют S-адресное поле, оно вместе с полубайтом, задающим номер индекс-регистра, формирует Х-поле. 4-битовое же поле, обычно занимаемое номером регистра-операнда, теперь содержит маску. Оттранслируем вручную команду

BNP 32(3,11)

В данном случае смещение равно 3210, регистр 3 используется в качестве индексного, а регистр 11 — в качестве базового. Расширенная мнемоника BNP транслируется в команду ВС с маской 13 следующего вида:

ВС 13,32(3,11)

или

ВС X 'D ',32(3,11)

Теперь, с учетом преобразования смещения в шестнадцатеричную форму, получим следующий машинный код:

47D3B020

Рассмотрим теперь другой пример. Оттранслируем команду

BZ ТОР

Имени ТОР соответствует смещение 15016, регистр 9 используется в качестве базового. Маской является 1000а=816. Таким образом, в машинном коде данная команда выглядит так:

47809150

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

Таблица 9.1 Расширенные мнемоники, маски и эквивалентные команды ВС

Расширенные

мнемоники

Значение

Маска(двоичная)

Маска(десятичная)

Эквивалентные команды ВС суказанием маски

В

Branch (unconditional)

1111

15

ВС

15

NOP

No Operation

0000

0

ВС

0

BZ

Branch on Zero

1000

8

ВС

8

BE

Branch on. Equal

1000

8

ВС

8

ВМ

Branch on Minus

0100

4

ВС

4

BL

Branch on Low

0100

4

ВС

4

ВР

Branch on Plus

0010

2

ВС

2

BH

Branch on High

0010

2

ВС

2

BO

Branch on Overflow

0001

1

ВС

1

BNZ

Branch on Not Zero

0111

7

ВС

7

BNE

Branch on Not Equal

0111

7

ВС

7

BNM

Branch on Not Minus

1011

11

ВС

11

BNL

Branch on Not Low

1011

И

ВС

11

BNP

Branch on Not Plus

1101

13

ВС

13

BNH

Branch on Not High

1101

13

ВС

13

BNO

Branch on Not Overflow

1110

14

BC

14

В табл. 9. 1 приведены все расширенные мнемоники, обрабатываемые ассемблером F OS/360. До настоящего момента мы рассматривали получение признака результата только как результат выполнения некоторых арифметических операций. Впоследствии мы увидим, что признак результата вырабатывается и в результате выполнения логических операций (команд, выполняющих логическое преобразование исходных данных).

Расширенные мнемоники команд, ориентированных на использование вместе с логическими командами, также приведены в табл.

9.1. Отметим, что эти мнемоники зачастую являются аналогами уже изученных. Например, команды BE и BZ эквивалентны, так как и той и другой соответствует маска 10002. Заметим также, что маской, соответствующей мнемонике NOP (NO OPERATION — Нет операции), является 00002, и это означает, что переход по такой команде никогда не выполняется. Но для чего же может использоваться не выполняющая никаких действий команда? NOP используется в целях резервирования памяти для команды, которая, возможно, будет записана на ее место уже во время выполнения программы. Еще одним возможным применением NOP является ее указание вместе с командой ЕХ, которая будет описана .в гл. 13.

Существует 16 различных масок, не каждой из которых соответствует расширенная мнемоника. Если мы хотим передать управление по адресу LOCO при получении нулевого результата или при возникновении переполнения, мы должны написать

ВС 9, LOCO

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

ВС

15,ВТАВ(9)

ВС

15.SEC1

ВС

15.SEC2

ВС

15.SEC3

ВС

15.SEC4

Предположим, что в нашу программу включены четыре программные секции, первые команды которых имеют соответственно метки SEC1, SEC2, SEC3 и SEC4. Мы хотим приступить к выполнению какой-либо одной из этих секций в зависимости от результатов обработки некоторой информации. Организовать выполнение подобных действий можно так:

ВТАВ

Здесь мы использовали регистр 9 в качестве индексного. Предполагается, что содержимое регистра 9 установлено предыдущей частью программы. Если нужно перейти к выполнению SEC3, в регистр 9 должно быть предварительно занесено число 8. Читатели, знакомые с языком ФОРТРАН, могут считать, что данная последовательность команд эквивалентна вычисляемому GO ТО.

Другой пример использования таблицы переключателей связан с работой операционной системы. Многие программы, такие, например, как ассемблеры, компиляторы, редакторы связей и другие системные программы вырабатывают код завершения для индикации своего успешного или неуспешного выполнения. Этот код обычно кратен числу 4 и используется операционной системой аналогично значению индекса в предыдущем примере. Например, код 0 означает, что выполнение программы прошло успешно и нужно перейти к выполнению следующего шага задания. Код 4 может означать, что была отмечена ошибка, но ошибка несущественная для правильного выполнения следующего шага. Операционная система выдает предупреждающее сообщение и приступает к выполнению следующего шага. Код 8 обычно означает, что ошибка была столь серьезна, что дальнейшая работа с данным заданием нецелесообразна. Выполнение задания прекращается. Какие действия предпримет операционная система, определяется кодом завершения, который используется как индекс в таблице переключателей.

 

Команда BCR является RR-модификацией команды ВС. Она работает абсолютно так же, как и команда ВС, только адрес, по которому следует совершить переход, выбирается из регистра R2, а не задается как операнд в памяти.

BCR M1,R2

Branch of Condition to Register

PC(R2), если признак результата соответствует Ml

Для использования команды BCR необходимо сначала загрузить адрес перехода в регистр. Маска определяется так же, как и для команды ВС. Вместо указания адреса, по которому следует передать управление, задается регистр R2, содержащий данный адрес. Предположим, что мы хотим осуществить переход по адресу SITU, если признак результата не равен нулю, используя команду BCR. Где-либо в программе до команды BCR нужно поместить команду

LA 5,SITU

которая загрузит адрес команды с меткой SITU в регистр 5. Затем следует написать команду

BCR 7,5

или

BCR В'0111',5

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

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

На рис. 9.2 представлена соответствующая программа. Первые две команды загружают в регистры 9 и 10 адреса LESS и CHECKER. Регистр 3 — индексный, в качестве его начального содержимого устанавливается число 2. Конечное значение индекса — 28; это число загружается в регистр 5 и сравнивается в цикле с содержимым регистра 3. Команда BCR в одном случае проверяет, является ли рассматриваемое в настоящий момент число меньшим, чем минимальное из предыдущих (X на блок-схеме), а в другом случае используется для проверки условия выхода из цикла и завершения решения.

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

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

Машинная форма команды BCR имеет формат обычной RR-команды, лишь вместо R1 указывается 4-разрядная маска:

Например, команда

BCR 13,10

транслируется в

07DA

а команда

BCR 15,8 в 07F8

Существуют две расширенные мнемоники команды BCR. Мнемоника BR (Branch-to-Register) соответствует маске, обеспечивающей безусловный переход по адресу, указанному в регистре. Команда BR имеет следующий вид:

BR R2

Ей эквивалентна команда

BCR 15,R2

BR 14

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

BCR B'1 111',14

Другая расширенная мнемоника, NOPR, соответствует маске 0.

BCR 0,R2

Мнемоника NOPR используется для резервирования 2-байтового поля внутри программы, в Koiopoe впоследствии может быть внесена любая другая команда такой же длины. Первый байт зарезервированного таким образом поля содержит 07 (код операции BCR), а второй — 0R2. NOPR также может быть использована вместе с командой EX.

В некоторых моделях IBM 360/370 время выборки команд из памяти зависит от длины команды. При выполнении заданий на этих машинах выгодно, там где это возможно, использовать команды типа RR вместо RX, так как это сокращает время выполнения программы. Однако следует учитывать, что обычно выполнение команд типа RR требует белее длительной подготовки. Из рис. 9.2 видно, что если команду ВС мы хотим заменить командой BCR, то предварительно следует загрузить адрес перехода в соответствующий регистр. Время, тратящееся на выполнение команды LA, может превышать сэкономленное заменой время. Кроме того, для выполнения BCR в отличие от ВС требуется регистр, который, вообще говоря, может быть использован и для других целей. Таким образом, вопрос о том, какую из команд, ВС или BCR, использовать, не может быть решен однозначно — решение зависит от типа машины и от того, сколько раз выполняется команда перехода и сколько раз необходимо проводить предварительную подготовку.

Команда BCR обычно используется в том случае, когда имя команды, на которую следует передать управление, неизвестно. Эта команда может быть даже командой другой программы, что и имеет место в случае возврата из подпрограммы. Как мы увидим в гл. 13, одна из функций подпрограммы — организовать возврат в соответствующее место основной программы. Адрес возврата обычно передается подпрограмме через регистр 14. Таким образом, обычно последней в подпрограмме выполняется команда

BR 14

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