Подпрограмма сложения чисел с двойной точностью
Распределение общих регистров: R1:XH, R3:YH, R5:SH R2:XL, R4:YL, R6:SL
Рис. 5.3 Блок-схема алгоритма сложения чисел с двойной точностью
Первая команда загружает младшую часть X в аккумулятор. Затем команда сложения складывает младшие части X и Y без начального переноса. Итоговый перенос из старшего разряда устанавливается на триггер переноса С. Затем полученная на сумматоре младшая часть суммы передается в регистр 6. После этого старшая часть X передается в аккумулятор. Далее команда «сложение с переносом» складывает старшие части X и Y и перенос С. В результате старшая часть суммы оказывается в аккумуляторе, а окончательный перенос — в триггере переноса С. Старшая часть суммы передается в регистр 5 следующей командой. Последняя команда — возврат из подпрограммы. Умножение Вы конечно, обратили внимание на отсутствие команды умножения в системе команд нашего иллюстративного микропроцессора. Отсутствие умножения (так же как и других операций, более сложных, чем сложение и вычитание) типично для большинства микропроцессоров. Если нет отдельной команды для умножения, то можно, разумеется, написать подпрограмму, которая будет его выполнять, следуя одной из известных процедур. В частности, можно реализовать процедуру получения и сложения частных произведений, как это делается при умножении «в столбик».
Рассмотрим умножение двух 8-битовых чисел без знаков. Вообще говоря, можно осуществить процедуру умножения, накапливая текущую частную сумму частных произведений, которые получаются последовательно, начиная с частного произведения, соответствующего младшему разряду множителя. Таким образом, каждое частное произведение прибавляется к частной сумме. После каждого сложения частная сумма сдвигается вправо, что соответствует выравниванию разрядов различных частных произведений. Каждое частное произведение равно либо множимому, если соответствующий разряд множителя равен 1, либо нулю, если разряд множителя равен 0. Сложив все 8 частных произведений и сдвинув результат, мы получим частную сумму, равную полному 16-разрядному произведению. Изложенная процедура показана на блок-схеме рис. 8.4. Символы X, Y, Рн и PL обозначают соответственно 8-битовые значения множителя, множимого, старших разрядов произведения (ст. часть) и младших разрядов произведения (мл. часть). Блок-схема представляет собой цикл. Она начинается с двух блоков инициализации цикла. Первый блок устанавливает старшую и младшую части произведения (в котором будет накапливаться частная сумма) равными нулю. Второй блок устанавливает значение 8 (соответствующее числу битов множителя) на счетчик, который будет считать число итераций в цикле. Следующий блок принадлежит самому циклу. В нем множитель X сдвигается вправо так, чтобы младший бит попал в триггер С для последующего тестирования. Фактически этот бит соответствует текущему анализируемому биту множителя, по которому определяется частное произведение для прибавления к частной сумме. В следующем блоке тестируется С. Если С=1, множимое прибавляется к частной сумме, а перенос из старшего разряда попадает в триггер С. В противном случае, когда С=0, сложение не производится, поскольку частное произведение равно 0.
В любом случае следующий блок вызывает циклический сдвиг старшей части частной суммы Рн и переноса С вправо. При этом старшие разряды суммы циклически сдвигаются вправо; содержимое С, где до сдвига находится старший разряд частной суммы, попадает в старший разряд рн, а младший разряд Рн сохраняется в С. Затем следующий блок сдвигает младшие разряды частной суммы PL вправо, «вдвигая» в нее слева значение С. На этом рабочая часть очередной итерации заканчивается. Следующий блок вычитает 1 из счетчика циклов. Затем счетчик тестируется. Если он равен 0, процесс умножения заканчивается, в противном случае цикл повторяется. По рассмотренной блок-схеме нетрудно написать программу для микропроцессора. Фактически блок-схема и составлялась в расчете на наш микропроцессор; особенно это видно по действиям с триггером С. Большинство промышленных микропроцессоров работает с триггером переноса аналогичным образом, и поэтому для них описанная блок-схема программируется так же легко. В табл. 7 приведена подпрограмма умножения. Регистры распределены следующим образом: R2—счетчик итераций, R3—множимое Y, R4—множитель X, R5—старшая часть произведения рн, R6— младшая часть произведения PL. Первые три команды соответствуют двум первым блокам блок-схемы и осуществляют инициализацию цикла. Следующие
Рис. 5.4 Блок схема процедуры умножения
три команды переносят множитель X в аккумулятор из регистра 4, сдвигают его циклически вправо и результат возвращают в регистр 4. В результате очередной разряд множителя, определяющий частное произведение, оказывается на триггере переноса С. Затем для подготовки сложения и сдвигов старшая часть произведения рн переносится в аккумулятор. Показанное на блок-схеме тестирование С = 1 осуществляется командой «переход при ненулевом переносе». Она обеспечивает пропуск следующей команды при С=0. Эта следующая команда прибавляет множимое Y к аккумулятору (который содержит рн) и сохраняет перенос из старшего разряда в С. Затем Рн и С циклически сдвигаются вправо командой RTR. После сдвига новое значение рн возвращается в регистр 5. Затем в соответствии со следующим блоком схемы pl и С сдвигаются вправо, для чего с помощью трех команд pl из регистра 6 загружается в аккумулятор, циклически сдвигается вместе с С и результат возвращается в регистр 6. После этого счетчик в регистре 2 уменьшается на 1 командой DHL, результат передается в аккумулятор и тестируется командой «переход при ненулевом аккумуляторе». Если аккумулятор содержит 0, то выполняется выход из подпрограммы; в противном случае управление передается на начало цикла.
Загрузка программ Важную роль в компьютерах играют средства загрузки исполняемых программ в память машины. Во многих приложениях, где микропроцессоры выполняют лишь какие-то раз и навсегда установленные функции, программы хранятся в постоянной памяти. Однако в приложениях, требующих большей гибкости и разнообразия, программы загружаются в оперативную память по мере необходимости. Обычно это делает специальная программа-загрузчик, которая выполняет операции по вводу требуемой программы с некоторого устройства ввода и размещению ее в памяти.
Таблица 5.7
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|