Пример программы: «прибавить константу к числу в памяти и записать результат снова в память»



 

Номер ячейки памяти (шест-надцатерич-ный) Команда на машин­ном языке Команда в символиче­ской форме Комментарий
0000 70 LDR 0 Передача содержимого ячейки    памяти
0001 00 00 000 А в аккумулятор
0002  
0003 61 LRI 1 Загрузка в регистр 1 величины 3С
0004 ЗС ЗС  
0005 81 ADD 1 Сложение регистров 0 и 1, сумма в аккумуляторе
0006 74 SТR 0 Передача содержимого аккумулятора
0007 00 00 в ячейку 000В
0008 OB  
0009 FA HLT Останов программы
000А     Исходное число
000В     Сумма

 

 

Разветвления в программах

Одно из наиболее мощных свойств компьютеров заключается в их способности принимать решения в ходе выполнения программы. Эти решения принимаются в зависимости от простых условий, сложившихся на данный момент. Обычно в результате принятия реше­ния либо сохраняется последовательный порядок выполнения прог­раммы, либо происходит переход на другую часть программы. Слож­ные решения реализуются в виде нескольких простых разветвлений. Чтобы пояснить сказанное, рассмотрим программу, которая вы­бирает наибольшее из трех 8-битовых целых положительных чисел х, у и z. Сначала определяется наибольшее из двух чисел х и у путем вычитания второго из первого и проверки заема в старший разряд. Отсутствие заема говорит о том, что х больше или равен у. С другой стороны, присутствие такого заема означает, что у больше х. Затем аналогичным образом отыскивается наибольшее из двух чисел: z и найденного ранее наибольшего из х и у.

На рис. 5.1. описанная выше процедура представлена в виде ди­аграммы. Такие диаграммы называются блок-схемами. Они весьма удобны для построения схемы вычисленного процесса.

Программа, решающая нашу задачу, приведена в табл. 5.2. Пред­полагается, что три исходных числа х, у и z расположены в ячейках 001В, 001С и 001D.

Программа должна поместить наибольшее число в аккумулятор. Первая команда программы загружает х в аккумуля­тор, а вторая помещает у в общий регистр 1. Затем осуществляется их сравнение путем вычитания уиз х. Если у строго больше х, тогда возникает заем в старший разряд, который сохраняется в виде еди­ницы в триггере переноса С. Однако еще до проверки переноса С значение х как «пробное» наибольшее из х и у загружается в регистр 2. Эта загрузка не влияет на состояние триггера переноса С.

 

 

Рис. 5.1. Блок-схема программы выбора наибольшего из трех положительных чисел x, y и z

 

 

Таблица 5.2

Программа отыскания наибольшего из трех 8-битовых целых чисел без знаков х, у и z

Ячейка памяти Команда на машин­ном языке Команда в сим­волической форме Комментарий
0000 70 LDR 0 Передача х. из памяти в аккумулятор
0001 00 00  
0002  
0003 71 LDR 1 Передача у из памяти в регистр 1
0004 00 00  
0005 1C 1C  
0006 А1 SUB 1 Вычитание у из х. Триггер С устанавливается, если у > х
0007 72 LDR 2 Передача х в регистр 2 как возможного наибольшего
0008 00 00  
0009 1B  
000А JCZ Проверка С на наличие заема. Если нет заема, то х 
000В 00 00  больше у, и следующая команда пропускается
000С 10 10  
000D 72 LDR 2 Передача у в регистр 2, замещающая х
000Е 00 00 если у больше х
000F 1C 1C  
0010 71 LDR 1 Передача z из памяти в регистр 1
0011 00 00  
0012 1D 1D  
0013 12 MOV 0  from 2 Передача наибольшего из х, у на аккумулятор из регистра 2
0014 А1 SUB 1 Вычитание z из наибольшего среди х, у.
      С устанавливается, если z больше
0015 12 MOV 0  from 2 Передача наибольшего из х, у в аккумулятор как возможного наибольшего
0016 JCZ Проверка С на наличие заема. Если заем есть,
0017 00 00  то z больше; в противном случае следующая команда
0018 1A  опускается
0019 11 MOV 0 from 1 Передача z в аккумулятор как наибольшего
001 А FA HLT Останов программы. Наибольшее число в аккумуляторе
001В     Число х
001С     Число у
001D     Число z

Затем выполняется команда условного перехода по значению С. Переход произойдет, если С имеет нулевое значение. Если С не равно нулю, то претендент на роль наибольшего, т. е. х, заменяется на у. Это делает следующая команда, которая загружает у в регистр 2. Если С=0, то управление передается на команду, хранящуюся в ячей­ке 0010, и в этом случае в качестве большего значения остается х. При любом варианте в этой точке программы наибольшее значение из х и у находится в регистре 2, и оно будет аналогичным образом срав­ниваться сz.

Значениеz передается из памяти в регистр 1 командой LDR, нахо­дящейся в ячейке 0010. Следующая команда передает наибольшее значение из х и у в аккумулятор. Затем осуществляется сравнение путем вычитания z из содержимого аккумулятора. Если z больше, то возникает заем. Наибольшее из х и у переносится из регистра 2 в аккумулятор на случай, если z окажется меньше. Затем снова про­веряется состояние триггера С командой JCZ. Если С=0, что говорит об отсутствии заема, то делается переход на команду останова. В про­тивном случае выполняется очередная команда, загружающая в ак­кумулятор значение z, и после нее — команда останова. При всех условиях и конечном итоге на сумматоре оказывается значение наи­большего из трех чисел х, у и z.

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

Программирование циклов

Цикл в программе — это средство, позволяющее с помощью одной и той же последовательности команд выполнить какие-то действия много раз. В общем случае цикл — это группа команд, выполнение которых многократно повторяется за счет того, что в этой группе есть команда, возвращающая управление снова и снова на первую команду в группе, пока не выполнится некоторое условие окончания цикла. Способность выполнять циклы является одним из фундаментальных свойств ЭВМ. Благодаря циклам можно пользоваться командами по несколько раз, не дублируя их в памяти, тем самым сокращается размер программы.

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

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

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

 

Таблица 5.3


Дата добавления: 2018-04-05; просмотров: 352; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!