|
Микропроцессор 8088 значительно мощнее
предшествовавших ему
8=битовых устройств. Одна из причин увеличения мощности -
добавление команд умножения и деления к
набору команд
микропроцессора. В прежних микропроцессорах выполнение операций
умножения и деления требовало вызова
подпрограмм на языке
ассемблера.
Существует две команды умножения.
Покоманде MUL умножаются два
целых числа без знака и дает результат без
знака. По команде IMUL
умножаются целые числа со знаком. При
умножении целых чисел в
качестве операндов используются числа,
представленные в
дополнительном коде и получается
результат, имеющий правильный знак
и значение.
Обе команды умножения работают как с
байтами, так и со словами.
Однако диапазон форм представления
операндов гораздо уже, чем для
команд сложения и вычитания. Фиг. 4.13
иллюстрирует варианты
команды умножения. Чтобы умножить 8 бит на
8 бит, один из операндов
должен быть в регистре AL, а результат
всегда оказывается в
регистре AX. Результат может иметь длину
вплоть до 16 бит
(максимальное получаемое значение равно
255 * 255 = 65025). Чтобы
умножить 16 бит на 16 бит, один из
операндов нужно поместить в
регистр AX. Результат, который может быть
длиной до 32 бит
(максимальное значение 65535 * 65535 <
2+32) помещается в пару
регистров; в регистре DX содержатся
старшие 16 бит результата, а
врегистре AX - младшие 16 бит. Умножение
не допускает
непосредственного операнда.
Установка флагов командой умножения
несколько отличается от
других арифметических команд. Единственные
имеющие смысл два флага
- это флаги переноса и переполнения, и они
по=разному
устанавливаются двумя командами.
Команда умножения без знака MUL
устанавливает оба флага, если
старшая половина резул в регистре AL
получится 2AH; команда AAM
преобразует этот результат, оставляя в
регистре AH число 04H, и
02H в регистре AL - или распакованное
десятичное число 42 в паре
регистров AH:AL.
ЪДДДДДДДДї
і AX і
і BX і
і CX і
і DX і
ЪДДДДДДДДї АДДДДДДДДЩ ЪДДДДДДДДВДДДДДДДДї
і
AX і * ЪДДДДДДДДї ДДДДД> і
DX і AX
і
АДДДДДДДДЩ і SI і АДДДДДДДДБДДДДДДДДЩ
і DI і
і BP і
і SP і
АДДДДДДДДЩ
ЪДДДДДДДДї
і Память і
і(слова) і
АДДДДДДДДЩ
(a) Умножение слов
ЪДДДДДДДДДї
і AH і
і AL і
і BH і
і BL і
і CH і
і CL і
і DH і
і DL і
ЪДДДДДДДДї АДДДДДДДДДЩ ЪДДДДДДДДВДДДДДДДДї
і
AL і * ЪДДДДДДДДДї
ДДДДД> і AH
і AL і
АДДДДДДДДЩ і Память і АДДДДДДДДБДДДДДДДДЩ
і(байты) і
АДДДДДДДДДЩ
(b) умножение байтов
Фиг. 4.13 Операции умножения
Целое умножение со знаком (IMUL)
устанавливает флаги переноса и
переполнения в соответствии с тем же
критерием, т.е. эти флаги
устанавливаются в случае, когда результат
не может быть представлен
тоько своей младшей половиной. Однако,
поскольку число имеет знак,
то задача не сводится только к сравнению
старшей половины
результата с нулем. Команда IMUL
устанавливает флаги, если старшая
половина результата не является
распространением знака младшей. Это
значит, что в случае положительного
результата проверка будет такой
же, как для команды MUL - установка флага
происходит при ненулевой
старшей половине результата (но самый
старший бит равен нулю,
указывая на положительность результата). В
случае отрицательного
результата IMUL устанавливает флаги, если
старшая половина
результата состоит не только из едениц (но
старший бит равен 1,
указывая на отрицательность результата).
Например, перемножение
байтов с отрицательным результатом
устанавливает флаги когда
результат менше -128 - наименьшего числа,
представимого в одном
байте. Другой пример, перемножение слов с
положительным
результатом, устанавливает флаги, если
результат превышает 32 767 -
наиболшее представимое одним словом число.
|
|