Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Умножение двойного слова на двойное слово

Читайте также:
  1. F2: ФГБОУ ВПО Воронежский ГАУ, Улезько О.В., Маслова И.Н.
  2. АЦП двойного интегрирования
  3. Выраженном количественно-именным словосочетанием
  4. Дешифраторы (DC от слова decoder)
  5. Лекция 5. РАБОТА НАД СЛОВОМ В ХОРЕ
  6. ЛЕКЦИЯ 6 ВАЛЕНТНОСТИ СЛОВА И МОДЕЛЬ УПРАВЛЕНИЯ
  7. Лекция 7. Активные процессы современного словообразования
  8. Лекция № 14 Числовая последовательность. Сходящиеся и расходящиеся последовательности. Основные теоремы о пределе последовательности.
  9. Лекция № 8 Модальные слова
  10. Наглядность и слово в ознакомлении детей с природой.

Умножение двойного слова на слово

Многословное умножение

Повышение эффективности умножения

При умножении на степень числа 2 (2,4,8 и так далее) более эф­фективным является сдвиг влево на требуемое число битов. Сдвиг более чем на 1 требует загрузки величины сдвига в регистр CL. В следующих примерах предположим, что множимое находится в регистре AL или АХ:

Умножение на 2:

SHL AL,1 Умножение на 8:

MOV CL.3 SHL AX.CL

Обычно умножение имеет два типа: «байт на байт» и «слово на слово».

Как уже было показано, максимальное знаковое значение в слове ограничено величиной +32767. Умножение больших чисел требует вы­полнения некоторых дополнительных действий. Рассматриваемый под­ход предполагает умножение каждого слова отдельно и сложение полу­ченных результатов. Рассмотрим следующее умножение в десятичном формате:

х

2730 1365

 

Представим, что десятичная арифметика может умножать только двузначные числа. Тогда можно умножить 13 и 65 на 12 раздельно, следу­ющим образом:

13 65

х х

12 12

26 130

13 65

156 780

Следующим шагом сложим полученные произведения, но по­скольку число 13 представляло сотни, то первое произведение в действи­тельности будет 15600:

+

Ассемблерная программа использует аналогичную технику за ис­ключением того, что данные имеют размерность слов (четыре цифры) в шестнадцатеричном формате.

Процедура E10XMUL умножает двойное слово на слово. Множи­мое, MULTCND, состоит из двух слов, содержащих соответственно шест.3206 и шест.2521. Определение данных в виде двух слов (DW) вме­сто двойного слова (DD) обусловлено необходимостью правильной ад­ресации для команд MOV, пересылающих слова в регистр АХ. Множи­тель MULTPLR содержит шест.6400.

Область для записи произведения, PRODUCT, состоит из трех слов. Первая команда MUL перемножает MULTPLR и правое слово по­ля MULTCND; произведение — шест. ОЕВО Е400 записывается в PROD-UCT+2 и PRODUCT+4. Вторая команда MUL перемножает MULTPLR и левое слово поля MULTCND, получая в результате шест. 138А 58.00. Далее выполняется сложение двух произведений следующим образом:

Произведение 1: 0000 ОЕ80 Е400 Произведение 2: 138А 5800

Результат: 138А 6680 Е400

 

Так как первая команда ADD может выработать перенос, то вто­рое сложение выполняется командой сложения с переносом ADC (ADd with Carry).

В силу обратного представления байтов в словах, область PROD­UCT в действительности будет содержать значение 8А13 8066 00Е4. Про­грамма предполагает, что первое слово в области PRODUCT имеет на­чальное значение 0000.

Умножение двух двойных слов включает следующие четыре опе­рации умножения:

Множимое Множитель слово 2 слово 2 слово 2 слово 1 слово 1 слово 2 слово 1 слово 1

Каждое произведение в регистрах DX и АХ складывается с соот­ветствующим словом в окончательном результате.

Хотя логика умножения двойных слов аналогична умножению двойного слова на слово, имеется одна особенность, после пары команд сложения ADD/ADC используется еще одна команда ADC, которая при­бавляет 0 к значению в итоговом поле.

Это необходимо потому, что первая команда ADC сама может вы-чвать перенос, который последующие команды могут стереть. Поэтому вторая команда ADC прибавит 0, если переноса нет, и прибавит 1, если перенос есть.

Финальная пара команд ADD/ADC не требует дополнительной команды ADC, так как область итога достаточно велика для генерации окончательного результата и переноса на последнем этапе не будет.

Сдвиг регистровой пары DX:AX

Следующая подпрограмма может быть полезна для сдвига содержимого регистровой пары DX:AX вправо или влево. Можно придумать

более эффективный метод, но данный пример представляет общий под­ход для любого числа циклов (и, соответственно, сдвигов) в регистре СХ. Заметьте, что сдвиг единичного бита за разрядную сетку устанавливает флаг переноса.

Сдвиг влево на 4 бита

MOV СХ,04 Инициализация на 4 цикла С20: SHL DX,1 ;Сдвинуть DX на 1 бит влево SHL АХ, 1 ;Сдвинуть АХ на 1 бит влево ADC DX,00 ;Прибавить значение переноса LOOP C20 ;Повторить Сдвиг вправо на 4 бита MOV CX.04 Инициализация на 4 цикла D20: SHR АХ,1 ;Сдвинуть АХ на 1 бит вправо SHR DX, 1 ;Сдвинуть DX на 1 бит вправо JNC D30 ;В случае, если есть перенос, OR АН,10000000В ; то вставить 1 в АН D30: LOOP D20 ;Повторить

Ниже приведен более эффективный способ для сдвига влево, не требующий организации цикла. В этом примере фактор сдвига записы­вается в регистр CL.

Пример написан для сдвига на 4 бита, но может быть адаптирован для других величин сдвигов:

MOV CL.04 Остановить фактор сдвига SHL DX.CL ;Сдвинуть DX влево на 4 бита MOV BL.AH Сохранить АН в BL SHL AX.CL ;Сдвинуть АХ влево на 4 бита SHL BL,CL ;Сдвинуть BL вправо на 4 бита OR DL.BL ;Записать 4 бита из BL в DL


<== предыдущая страница | следующая страница ==>
Слово на слово | Переполнения и прерывания

Дата добавления: 2014-03-11; просмотров: 572; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.