Пример программы: «прибавить константу к числу в памяти и записать результат снова в память»
Номер ячейки памяти (шест-надцатерич-ный) | Команда на машинном языке | Команда в символической форме | Комментарий |
0000 | 70 | LDR 0 | Передача содержимого ячейки памяти |
0001 | 00 | 00 | 000 А в аккумулятор |
0002 | 0А | 0А | |
0003 | 61 | LRI 1 | Загрузка в регистр 1 величины 3С |
0004 | ЗС | ЗС | |
0005 | 81 | ADD 1 | Сложение регистров 0 и 1, сумма в аккумуляторе |
0006 | 74 | SТR 0 | Передача содержимого аккумулятора |
0007 | 00 | 00 | в ячейку 000В |
0008 | 0В | 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 | 1В | 1В | |
0003 | 71 | LDR 1 | Передача у из памяти в регистр 1 |
0004 | 00 | 00 | |
0005 | 1C | 1C | |
0006 | А1 | SUB 1 | Вычитание у из х. Триггер С устанавливается, если у > х |
0007 | 72 | LDR 2 | Передача х в регистр 2 как возможного наибольшего |
0008 | 00 | 00 | |
0009 | 1В | 1B | |
000А | 7С | 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 | 7С | JCZ | Проверка С на наличие заема. Если заем есть, |
0017 | 00 | 00 | то z больше; в противном случае следующая команда |
0018 | 1А | 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!