Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
99
Добавлен:
02.05.2014
Размер:
29.7 Кб
Скачать

Инструкции 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Н.

Соседние файлы в папке Лекции по ассемблеру