Умножение

    Микропроцессор 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 -

    наиболшее представимое одним словом число.