Инструменты пользователя

Инструменты сайта


examination:asm:question33

Вопрос №33. Умножение двоичных чисел

Команда MUL служитдля умножения 8-, 16- и 32-разрядных беззнаковых целых чисел, находящихся в одном из регистров общего назначения или в памяти, с операндом, расположенным в регистре AL, АХ или EAX:

MUL r/m8

MUL r/ml6

MUL r/m32

Второй операнд-сомножитель задан неявно, его местоположение фиксировано и зависит от размера операндов:

Из таблицы видно, что произведение состоит из двух частей и в зависимости от размера операндов размещается в двух местах – на месте второго сомножителя (младшая часть) и в дополнительных регистрах AH, DX, EDX (старшая часть). Если после умножения старшая часть результата нулевая, то флаги CF=OF=0; Если флаги CF и OF ненулевые, это означает, что результат состоит из двух частей;

Чтобы при выполнении операции умножения не возникло переполнения, размер произведения должен в два раза превышать размеры множимого и множителя.

В результате выполнения команды MUL устанавливаются два флага: переноса CF и переполнения OF, если значение старшей половины произведения не равно нулю. Мы специально здесь делаем акцент на флаге CF, поскольку обычно он используется при анализе результатов выполнения арифметических команд с целыми числами без знака. Например, при умножении регистра АХ на 16-разрядный операнд, произведение сохраняется в паре регистров DX: АХ. При этом, если регистр DX не равен нулю, будет установлен флаг переноса CF.

Команда IMUL

Эта команда предназначена для умножения целых чисел со знаком. Она имеет такой же синтаксис и формат операнда, что и команда MUL. Разница заключается только в том, что при умножении с помощью этой команды сохраняется знак произведения. В результате выполнения команды lMUL устанавливаются два флага: переноса СF и переполнения OF, если значение старшей половины произведения не является расширением знакового разряда, взятым с младшей половины произведения. Мы специально здесь делаем акцент на флаге OF, поскольку обычно он используется при анализе результатов выполнения арифметических команд с целыми числами со знаком. Если результат мал и умещается в одном регистре (то есть флаги нулевые), то содержимое другого регистра является расширением знака – все его биты равны старшему биту младшей части результата. В противном случае знаком результата является знаковый бит старшей части результата.

examination/asm/question33.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)