Лекции по архитектуре ЭВМ / умнож
.docИнструкции MUL используется для умножения беззнаковых величин, а инструкция IMUL – для умножения знаковых чисел. Обе инструкции могут изменять состояние флагов переноса CF и переполнения OF. На программиста возлагается задание формата данных, подлежащих обработке, и выбор подходящей инструкции умножения.
Формат инструкций следующий:
MUL регистр
MUL память
IMUL регистр
IMUL память.
Можно умножать байт на байт, слово на слово и в 32-разрядных моделях Intel – двойное слово на двойное слово.
Как видно из формата, в команде указывается только один из сомножителей, второй сомножитель по умолчанию располагается в регистре AL для байтовых операндов и в регистре АХ – для двухбайтовых операндов.
Примеры команды MUL:
BYTE1 DB 80H
BYTE2 DB 40H
WORD1 DW 8000H
WORD2 DW 2000H
MOV AL,BYTE1 ;байт умножается на байт
MUL BYTE2 ;результат в АХ, равный 2000Н (8192=128*64)
(если до команды MOV AL,BYTE1 в АН содержались какие-либо данные, командой MUL BYTE2 эти данные будут затерты)
MOV AX,WORD1 ;слово умножается на слово
MUL WORD2 ;результат в в DX:AX, равный 1000 0000Н
Если потребуется умножить байт на слово, необходимо сначала привести в соответствие размеры операндов. Существуют в Ассемблере команды CBW –преобразовать байт в слово и CWD – преобразовать слово в двойное слово. Обе команды не имеют операндов. Команда CBW по умолчанию оперирует содержимым регистра AL, а результат помещает в регистр AX. Команда CWD по умолчанию выбирает слово из регистра AX и помещает результат в DX:AX. Преобразование заключается в заполнении битом знакового разряда старших регистров результата – для команды CBW – регистра АН, а для команды CWD – регистра DX.
Обе команды дают верный результат при работе со знаковыми данными, но могут давать ошибочные результат с беззнаковыми данными. Например,
MOV AL,BYTE2
CBW
позволит получить результат в АХ, равный 0020Н, а команды
MOV AL,BYTE1
CBW
даст результат в АХ, равный FF80H, что, конечно, неверно.
Поэтому для беззнаковых данных при необходимости преобразования к большему формату следует заполнить нулями старшую часть операнда расширенного формата и оперировать в последующих командах расширенным операндом, например:
MOV AL,BYTE1
MOV AH, 0 ;поместили сомножитель в регистр АХ
MUL WORD2 ;результат в в DX:AX, равный 1 0000Н
Команда IMUL реализует перемножение знаковых чисел. Результаты применения этой инструкции к приведенным выше данным будут следующие:
MOV AL,BYTE1 ;байт умножается на байт
IMUL BYTE2 ;результат в АХ, равный E000Н (-8192=-128*64)
MOV AX,WORD1 ;слово умножается на слово
MUL WORD2 ;результат в в DX:AX, равный F0000000Н
MOV AL,BYTE1
CBW ;поместили сомножитель в регистр АХ (FF80H)
IMUL WORD1 ;результат в в DX:AX, равный 0040 0000Н.