Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Умножение двойного слова на двойное словоУмножение двойного слова на слово Многословное умножение Повышение эффективности умножения При умножении на степень числа 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). В силу обратного представления байтов в словах, область PRODUCT в действительности будет содержать значение 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; Нарушение авторских прав Мы поможем в написании ваших работ! |