Assembler для начинающих


Умножение



Умножение


    Микропроцессор 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 -
    наиболшее представимое одним словом число.




Содержание раздела