Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Программа отыскания наибольшего из трех 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

Программа вычисления суммы десяти 8-битовых чисел

Без знаков

Ячейка памяти Команда на машин­ном языке Команда в сим­волической форме Комментарий
0000 61 LRI 1 Установка в регистрах Н и L адреса
0001 00 00  первого числа
0002 62 LRI 2  
0003 15 15  
0004 63 LRI 3 Установка начального значения 
0005 счетчика цикла равным 10
0006 64 LRI 4 Установка частной суммы равной 0
0007 00 00  
0008 65 LRI 5 Загрузка константы 1 для  
0009 01 01 уменьшения счетчика
000А 14 MOV 0 from 4 Прибавление очередного числа
000В 8F ADD F  
000С 04 MOV 0 to 4  
000D F5 IHL Увеличение Н и L
000Е 13 MOV 0 from 3 Уменьшение счетчика
000F А5 SUB 5  
0010 03 MOV 0 to 3  
0011 7D JAN Проверка конца цикла
0012 00 00  
0013 0A  
0014 FA HLT  
0015   ЧИСЛО1 Суммируемые числа
0016   ЧИСЛО2 *  
. . .   . . .  
001Е   ЧИСЛ010  

 

Суммируется содержимое после­довательных ячеек. Первые пять команд составляют инициализирую­щую часть. Общие регистры Н и L используются в качестве 16-бито­вого указателя, содержащего адрес очередного прибавляемого числа.

Первые две команды заносят в Н и L адрес первого числа. Затем в регистр 3 помещается начальное значение, равное 10. Регистр 3 бу­дет выполнять функции счетчика количества суммируемых чисел, ко­торые программе еще предстоит обработать. Сумма накапливается в общем регистре 4. Четвертая команда в программе устанавливает в нем нулевое начальное значение. Наконец, в общий регистр 5 загру­жается константа 1, которая будет вычитаться из счетчика в процессе суммирования чисел.

Следующие три команды составляют рабочую часть цикла. Сначала текущая частная сумма передается в аккумулятор из регистра 4. Далее следует команда сложения ADD F, содержащая специальный указатель F, который на самом деле соответствует ячейке главной памяти с адресом в паре регистров Н и L. Содержимое этой ячейки прибавляется к частной сумме в аккумуляторе. После этого результат передается в общий регистр 4.

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

Обратите внимание, в описанной программе по команде ADD F вполне можно получить сумму, превышающую емкость аккумулятора, т. е. частная сумма может занять 9 разрядов. Это и есть переполне­ние, о котором мы уже упоминали. Ясно, что если переполнение может возникнуть, то оно должно детектироваться (в рассматриваемом случае при переполнении после выполнения команды ADD F ока­жется установленным в 1 триггер переноса), и нужно иметь возмож­ность работать с суммами, занимающими более 1 байта. Обычно в подобных задачах применяется процедура сложения «с двойной», «тройной» или большей «точностью».

Программирование сложных

Разветвлений

Исходные концепции, касающиеся принятия решений, мы рассмот­рели в разд. 2.2. Процедура сводилась к тому, чтобы сформировать проверяемое условие, т. е. результат, служащий основой для при­нятия решения, а затем проверить это условие с помощью подходя­щей команды условного перехода. Таким способом микропроцессор выбирает один из двух возможных путей дальнейшего выполнения программы, другими словами, одну из двух ветвей. Эту процедуру легко обобщить на случай большего количества ветвей, т. е. на слу­чай более сложных разветвлений. Для этого нужно сформировать те­стируемую переменную, которая может принимать несколько зна­чений. С каждым из значений связывается своя ветвь в программе. Микропроцессор должен в результате проверок выбрать одну из ветвей.

Один из подходов — это сравнивать тестируемую переменную по­очередно со всеми возможными ее значениями. При положительном результате сравнения с первым значением управление передается на первую ветвь программы. При отрицательном— производится сравнение со вторым возможным значением и т. д. Этот метод показан на рис. 5.2.

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

 

 

 

Рис. 5.2. Один из методов прог­раммирования сложных

развет­влений

Чтобы проиллюстрировать этот метод, предположим, что нам нужно совершить переход по одному из восьми направлений, и условие раз­ветвления формулируется следующим образом:

Перейти на программу 1, если в аккумуляторе 00000001,

Перейти на программу 2, если в аккумуляторе 00000010

       …………………………………………………………………………………………..

       Перейти на программу 8, если в аккумуляторе 10000000.

Программа, показанная в табл. 4 решает нашу задачу в предположении, что тестируемая переменная находится в аккумуляторе. В ячейках с 2000 по 200F расположена таблица переходов, содержащая 8 начальных адресов, по которым возможно разветвление. Основная задача программы — преобразовать значение тестируемой переменной в соответствующий адрес строки в таблице переходов. Это позволит выбрать нужный адрес из таблицы и передать по нему управление.

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

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

 

Таблица 5.4










Последнее изменение этой страницы: 2018-04-12; просмотров: 261.

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