Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Подпрограмма сложения чисел с двойной точностью




Распределение общих регистров: R1:XH, R3:YH, R5:SH

R2:XL, R4:YL, R6:SL

Ячейка памяти Команда на машин­ном языке Команда в символи­ческой форме Комментарий
    MOV 0 from 2 Загрузка XL в аккумулятор
    ADD 4 Сложение YL с XL, С = перенос
    MOV 0 to 6 Загрузка SL в регистр 6
    MOV 0 from 1 Загрузка Хн в аккумулятор
    ADC 3 Сложение Хн, Ун и С
    MOV 0 to 5 Загрузка SH в регистр 5
  F8 RET Возврат из подпрограммы

 

 

Рис. 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...