Структура программ

Под структурой программы понимаются предложения, необходимые для формирования законченной программы, и предложения, определяющие порядок выполнения команд в ней. Сначала рассмотрим предложения второго типа с целью ответа на вопрос: «Как можно управлять порядком выполнения команд в программе?»

КОМАНДА ПЕРЕХОДА (ПЕРЕДАЧИ УПРАВЛЕНИЯ)

Нормальный порядок команд в программе — это тот порядок, в котором они в ней расположены. Программист должен располагать команды в программе именно в нужном ему порядке. Неверное размещение даже одной команды может привести к ошибке. Например, по-

SR

5,5

CLEAR REGISTER 5 TO ZERO

RWD

2

READ FIRST NUMBER FROM DATA CARD

AR

5,2

ADO IT TO 15)

RWD

2

READ SECOND NUMBER

АR

5,2

ADO IT TO (5)

RWD

2

READ THIRD NUMBER

AR

5,2

ADD IT

RWD

2

READ FOURTH NUMBER

AR

5,2

AND ADD IT

RWD

2

READ LAST NUMBER

AR

5.2

ADD IT TO THE SUM AND

WWD

5

PRINT THE FINAL TOTAL

Рис. 5.1. Вычисление суммы пяти чисел, вводимых с перфократ. последовательность команд

LR    3,5

LR    5,4

LR    4,3

производит обмен содержимым между регистрами 4 и 5. Любой другой порядок выполнения этих команд (проверьте) не позволит добиться этой цели.

Но во многих случаях желательно, чтобы команды выполнялись в несколько ином порядке, чем они написаны. Предположим, что требуется подсчитать сумму пяти чисел, набитых на картах. На рис. 5.1 представлен один из способов достижения этой цели, при этом регистр 5 используется для хранения частичных сумм чисел, считываемых последовательно в регистр 2 по команде RWD. Такой способ сам по себе не так уже плох при условии, что для нас не составляет большого труда перфорация программы и в нашем распоряжении имеется достаточное количество машинной памяти. Но что, если необходимо вычислить сумму 100 чисел?

Теперь надо всего лишь организовать цикл, включающий команды ARи RWD; и выполнение этих команд будет возобновляться всякий раз, пока процессор не выйдет из цикла. Рис. 5.2 содержит блок- схему этого способа решения задачи. После ввода первого числа и вычисления частичной суммы мы снова возвращаемся к команде чтения карты. При этом используется безусловный переход, выполняющийся вне зависимости от каких-либо обстоятельств.

ВS2 Branch (unconditional) PC (счетчиккоманд)S2

При описании команды перехода мы указали лишь один операнд S(storage— память), снабдив его индексом 2. Это сделано потому, что данный операнд в соответствующей команде является вторым. S2 обычно представляет собой символическое имя команды, к выполнению которой мы хотим перейти. Итак, если мы хотим осуществить переход к выполнению команды с именем AGAIN, нужно написать

ВAGAIN

 

Рис. 5.2. Блок-схема вычисления суммы последовательности чисел, вводимых с перфокарт.

Результатом выполнения этой команды будет занесение адреса, соответствующего имени AGAIN, в счетчик команд. Таким образом, выполнение программы возобновляется, начиная с команды AGAIN.

На рис. 5.3 изображена программа, соответствующая блок-схеме 5.2. Используем следующие обозначения

SUMрегистр 5

Арегистр 2

Отметим, что мы решили задачу организации повторных выполнений вычислений; теперь нужно найти способ прервать их.

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

 

SR                5,5    START SUMАТ0

NEWNUM RWD        2      READ NEXTNUMBER

AR                5,2    ADD ITTO SUM

В                 NEWNUM GO BACK FOR MORE

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

Например, в результате выполнения команды ARможет получиться отрицательное число, положительное число или 0 (ситуацию переполнения мы пока не будем рассматривать). Признак результата после выполнения команды ARуказывает, какой именно случай имел место. Если

(3)=FFFFFFF0

(5)=00000002

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

AR                      3,5

признак результата будет указывать, что результатом сложения является отрицательное число. Из известных нам команд SRи RWDвызывают установкупризнака результата подобным образом в соответствии со знаком результата. Остальные команды не влияют на его значение.

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

SR                          5,3

LR                          4,6

MR                          4,3

ВОТ                  В      ТОР

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

Сейчас нам достаточно рассмотреть 6 команд условного перехода. Другие возможности организации переходов обсуждаются в гл. 9.

BP S2 Branch on Plus PCS2, еслирезультат> О

Слово результат означает результат выполнения последней команды, меняющей признак результата. По команде ВР (ПЕРЕХОД ПО ПЛЮСУ) переход на S2 осуществляется в случае, если результат больше 0.

 

BZ S2

Branch on Zero

РС<— S2, если результат = 0

(7)  = 00000002

(8)  = FFFFFFFE

(9)  = 00000010

а.

AR 7,9

б.

SR 7,8

 

BP YES

 

LR 7,9

 

В N0

 

BZ N0

 

 

 

В YES

в.

MR 8,7

г.

AR 7,8

 

AR 8,7

 

LCR 9,9

 

BP YES

 

BP YES

 

BM N0

 

BZ N0

Рис. 5.4. Примеры применения команд условного перехода.

Команда BZ(ПЕРЕХОД ПО НУЛЮ) вызывает выбор следующей команды из ячейки с адресом S2, если результат выполнения последней команды, влияющий на признак результата, равен 0.

BM S2 Branch on Minus PCS2, еслирезультат< О

Команда ВМ (ПЕРЕХОД ПО МИНУСУ) вызывает выбор S2 в качестве следующей команды, если результат выполнения последней команды, изменяющей признак результата, меньше 0.

Обратимся теперь к рис. 5.4. Регистры содержат указанные числа перед началом выполнения каждой из четырех последовательностей команд. Какие команды выполняются по окончании каждой из последовательностей: YESили N0? В случае (а) сумма равна 00000012, т. е. положительна, поэтому по команде ВР осуществляется переход к выполнению YES. В случае (б) также произойдет переход на команду YES, так как результат выполнения SRположителен, aLRне влияет на признак результата. В случае (в) после выполнения команды MRв регистре 8 устанавливается значение 00000000. В результате сложения получается положительное число, и следующей выполняется снова команда YES. Наконец, в случае (г) сумма равна 00000000, LCRне влияет на признак результата и переход осуществляется на команду с именем N0.

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

BNP       S2BranchonNot  Plus    PCS2,   результат0

BNZ       S2BranchonNot  Zero    PCS2,   результат0

BNM       S2BranchonNotMinus    PCS2,   результат0

При этом подразумевается, что любое число со знаком плюс больше 0 (0 — неположителен) и любое число со знаком минус — меньше 0

Рис. 5.5. Блок-схема программы вычисления cуммы пяти чисел.

L          9,=F'5'          FINAL VALUE OFLCOP   COUNTER  IN   REG.9

L          7,=F'0'          STARTING VALUE OF    LOOPCOUNTER   IS   0

L          4,=F'1'INCREMENT FOR LOOP COUNTER IS  1

SR         5,5    START SUM AT 0

NEXTNUM RWD     2  READ A NUMBER

AR         5,2    ADD IT TO SUM

AR 7,4              INCREMENT LOOP COCNTER

Ln                8,9     MAKE A COPY OF FINAL COUNTER   VALUE

SR         8.7    COMPUTE DIFFERENCE К-I

BM         NEXTNUM  GO BACK FOR MORE IF NOT DONE

5                PRINTRESULTINGSUM

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

(0 — неотрицателен). Например, по команде BNPпроизводится переход, если признак результата указывает, что последний меньше или равен 0.

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

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

SUMрегистр5

Арегистр     2

Крегистр    9(контрольноезначение счетчика цикла)

Iрегистр    7(счетчик    цикла)

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

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

Можно избежать этой неприятности, как это показано на рис. 5.6, сохраняя копию стираемого числа в некотором регистре (в данном случае копию К в регистре 8). В программе 5.6 перед сравнением счетчика цикла I, находящегося в регистре 7, с его конечным значением мы копируем содержимое регистра 9 в регистр 8.

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

SR                       8,7

полученный признак результата используется командой перехода. Этот метод неудачен по крайней мере по двум причинам: используется лишний регистр для хранения копии К (а мы всегда заинтересованы в наиболее экономном использовании регистров) и выполняется команда

LR8,9

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

Команда CR (СРАВНЕНИЕ)

CR R1.R2

Compare Register

Устанавливает признак результата в соответствии со знаком (R1)—(R2)

производит вычитание (R2) из (R1) и устанавливает признак результата в соответствии с этой разностью. Но запись разности при этом не производится; таким образом, содержимое R1 остается неизменным.

Команда CRможет быть использована везде, где мы хотим сравнивать числа, расположенные в двух регистрах, не изменяя их. Пусть

(9)=00000005

(7)=00000004

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

SR                       9,7

получится

(9)=00000001

и признак результата соответствует положительному числу.

Команда

CR                       9,7

получает ту же разность и тот же признак, но сохраняет старое содержимое регистров

(9)=00000005

(7)=00000004

На рис. 5.7 приведена программа рис. 5.6, модифицированная использованием команды CR. Теперь не нужно копировать содержите регистра 9 в регистр 8 и, значит, ни к чему выполнять команду

LR                      8,9

L 9,=F'5'

FINAL VALUE OF LOOP COUNTER IN REG 9

L 7,=F'0'

STARTING VALUE OF LOOP COUNTER IS 0

L 4,=F'1'

INCREMENT FOR LOOP COUNTER IS 1

SR 5,5

START SUM AT 0

NEXTNUM RWD 2

READ A NUMBER

AR 5,2

ADD IT TO SUM

AR 7,4

INCREMENT LOOP COUNTER

CR 9,7

COMPARE К WITH I

BM NEXTNUM

GO BACK FOR MORE IF NOT DONE

WWD 5

PRINT RESULTING SUM

Рис. 5.7. Программа рис. 5.6 с применением команды CRдля сравнения счетчика циклов с граничным значением.

Пару команд

LR                       8,9

SR                       8,7

мы заменяем одной

CR                       9,7.

Теперь вернемся к начатому в гл. 4 разговору о выполнении деления. Мы определили, что в соответствии со знаком делимого необходимо загрузить предыдущий регистр (регистр с четным номером) кодами 00000000 или FFFFFFFF. Командой, облегчающей выполнение этой задачи, является команда LTR(ЗАГРУЗКА И ПРОВЕРКА).

LTR R1 ,R2

Load and Test Register

R1(R2), установка признака (R2)

По команде LTR, как и по LR, содержимое R2 запоминается в R1, но только теперь устанавливается признак результата в соответствии со знаком (R2). Если

(5)                 = FFFFFFF3

(6)                 = 00000018

то после выполнения

LTR                      5,6

имеем

(5)=00000018

(6)=00000018

и признак результата соответствует положительному числу. Если R1 и R2 обозначают один и тот же регистр, то действие команды сводится к установке признака результата.

SR 6,6

ZERO IN FIRST REGISTER

LTR 7,4

SEE IF DIVIDEND POSITIVE

BP DIV

IF SO, OK TO DIVIDE

L 6,=F'-1'

IF, NOT, ALL ONES IN REGISTER 6

DIV DR 6,9

AND DIVIDE

Рис. 5.8. Деление (4) на (9) с использованием команды LTRдля проверки знака делимого.

Рис. 5.8 иллюстрирует применение LTRдля решения задачи рис. 4.5 (разделить (4) на (9)). После загрузки 0 в регистр 6 содержимое регистра 4 пересылается в регистр 7 с использованием LTR, определяющей знак (4). Если (4) отрицательно, то в (6) попадает число — 1 (FFFFFFFF16) для получения верного результата при делении.

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

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

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

имя STARTО

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

ENDимя

Эта команда идентифицирует конец программы, прерывая процесс ассемблирования. Именем в поле операндов является имя предложения, которое должно выполняться первым. Поскольку выполнение программы обычно начинается с начала, то в поле имени чаще всего указывается имя предложения START.

CALCSTARTО

PRINT NOGEN INITIAL

ASSEMBLY LANGUAGE STATEMENTS

EOJ

END CALC

Рис. 5.9. Схематическое представление структуры программы.

За предложением START обычно следует предложение

PRINTNOGEN

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

Макро INITIALинформирует о начале «выполняемой» части программы и является первым предложением, связанным с выполнением машинных команд. Мы скоро увидим, что каждая программа должна предусматривать возможность организации связей с подпрограммами для обеспечения правильного выполнения в условиях крупной вычислительной системы. Пока, чтобы не вдаваться в ненужные подробности, мы будем писать предложение INITIALв начале любой программы.

Аналогично макрокоманда EOJ(end-of-job— конец задания) выполняет определенные функции, связанные с завершением выполняемой программы. Предложение EOJможет быть расположено где угодно в программе. Его появление вызывает прерывание этой программы и передачу управления операционной системе.

Как и RWDи WWD, макрокоманды INITIALи EOJне являются стандартными макро систем фирмы. IBM. Они не могут быть использованы до тех пор, пока не будут специально внесены в системную библиотеку.

На рис. 5.9 схематически изображена структура законченной программы с именем CALC. Предложения START, PRINTNOGEN, INITIALпредшествуют «рабочей» части программы, которая завершается предложениями EOJи END.

На рис. 5.10 мы возвращаемся к примеру вычисления суммы чисел (см. рис. 5.7). Теперь только добавлены команды вычисления среднего арифметического и печати результата. Программа на рис. 5.10 представляет собой законченную программу на языке ассемблера, включающую команды ассемблера и макрокоманды связи подпрограмм и, таким образом, подготовленную к вводу и выполнению.

 

AVERAGE START 0

START OF PROGRAM

PRINT NOGEN

DO NCT PRINT MACRO EXPANSIONS

INITIAL

BEGIN EXECUTION HERE

RWD 9

READ NUMBER OF NUMBERS TO USE

LR 10,9

KEEP A COPY IN REGISTER 10

L 6,=F'1'

DECREMENT FOR COUNTING

SR 5 ,5

START SUM AT 0

NEXTNUM RWD 2

READ A NUMBER

AR 5,2

ADD IT TO SUM

SR 9,6

DECREMENT LOOP COUNTER

8NM NEXTNUM

GO BACK FOR MORE IF NOT DONE

NR 4,6

PREPARE FOR DIVISION BY NUMBER OF

OR 4,10

NUMBERS TO COMPUTE AVERAGE

WWD 5

QUOTIENT IN REGISTER 5

WWD 4

AND REMAINDER IN REGISTER 4

EOU

PROCESSING FINISHED STOP

END AVERAGE

END OF PROGRAM

Рис. 5.10. Полная программа вычисления среднего группы чисел и печати результата,

Макро INITIAL, EOJ, RWDи WWDдолжны следовать общим правилам использования регистров, принятым в операционной системе. По этим правилам не все 16 регистров доступны пользователю. Так, например, регистры 1, 13, 14 и 15 должны быть зарезервированы для использования операционной системой. Вопросы, связанные с соглашениями об использовании регистров, рассматриваются в гл. 13. Использование регистров, предназначенных для работы системы, в программе пользователя может привести к непредсказуемым результатам и вызвать аварийное завершение программы.

Теперь мы имеем все необходимое для составления законченных программ на языке ассемблера. Рассмотрим некоторые дополнительные требования, выполнение которых необходимо для организации программы и данных в виде полного задания в форме, приемлемой для обработки вычислительной системой.

{toc_noshowall}

Расскажи друзьям
 
Статьи раздела