Всего на сайте:
248 тыс. 773 статей

Главная | Информатика

Умножение  Просмотрен 295

Вы конечно, обратили внимание на отсутствие команды ум­ножения в системе команд нашего иллюстративного микропроцессора. Отсутствие умножения (так же как и других операций, более сложных, чем сложение и вычитание) типично для большинства микропроцес­соров. Если нет отдельной команды для умножения, то можно, разу­меется, написать подпрограмму, которая будет его выполнять, следуя одной из известных процедур. В частности, можно реализовать про­цедуру получения и сложения частных произведений, как это делается при умножении «в столбик».

Рассмотрим умножение двух 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, то выполняется вы­ход из подпрограммы; в противном случае управление передается на начало цикла.

 

 

Предыдущая статья:Подпрограмма сложения чисел с двойной точностью Следующая статья:Подпрограмма умножения целых положительных чисел
page speed (0.0186 sec, direct)