Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
10.09.2019
Размер:
9.47 Mб
Скачать

Команды умножения MUL и

IMUL

Это одни из САМЫХ НЕПРИЯТНЫХ команд целочисленной арифметики из-за наличия неявных операндов.

MUL (MULtiply - БЕЗЗНАКОВОЕ умножение)

IMUL (Integer MULtiply - ЗНАКОВОЕ целочисленное умножение).

Команды учитывают наличие ЗНАКА.

Синтаксис:

MUL Источник

IMUL Источник

Логика работы команд:

<Произведение> = <Множимоё> * <Множитель>

В качестве Множителя допустимы регистры и память: R8, R16, Мем8, Мем1б. Константы НЕ допускаются!!!

Множимое и Произведение находятся в СТРОГО ОПРЕДЕЛЕННОМ МЕСТЕ в зависимости от длины Множителя.

выводы

Команда IMUL реагирует на ЗНАК перемножаемых чисел.

Расположение Множимого и Произведения — строго определенное и зависит од ДЛИНЫ Множителя — это нужно просто ЗАПОМНИТЬ.

Длина Произведения всегда в ДВА раза больше, чем у Множителя. Причем старшая часть Произведения

находится либо в регистре АН, либо в DX. Именно об ЭТОМ обстоятельстве ЗАБЫВАЮТ как люди, так и компиляторы (их ведь тоже делали люди!)

Эти команды тоже вырабатывают флаги. Устанавливаются флаги CF=1 и OF=1, если результат слишком велик для отведенных ему регистров назначения.

Умножение больших чисел

Чтобы умножить большие числа, придется вспомнить правила умножения десятичных чисел в столбик: множимое умножают на каждую цифру множителя, сдвигают влево на соответствующее число разрядов и затем складывают полученные результаты. В нашем случае роль цифр будут играть байты, слова или двойные слова, а сложение должно выполняться по правилам сложения чисел повышенной точности. Алгоритм умножения оказывается заметно сложнее, поэтому умножим для примера только 64-битные числа:

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

Команды деления DIV и IDIV

DIV (DIVide - БЕЗЗНАКОВОЕ деление),

IDIV (Integer Divide - ЗНАКОВОЕ деление целых чисел).

Синтаксис:

DIV Источник IDIV Источник

Логика работы команд:

< Частное: Остаток> = <Делимоё> / <Делитель>

В качестве Делителя допустимы регистры и память:

R8, R16, Мем8, Мем16. Константы НЕ допускаются!!!

Где же находятся Делимое и <Частное:Остаток>

Опять источник ошибок — НЕЯВНЫЕ операнды. Они находятся тоже в СТРОГО ОПРЕДЕЛЕННОМ МЕСТЕ в зависимости от длины Дeлитeля.

Неявные операнды команд DIV,

IDIV

Выводы

Команда IDIV реагирует на ЗНАК обрабатываемых чисел.

Расположение Делимого и Результата — строго определенное и завиcсит от ДЛИНЫ Делителя.

Результат состоит из Частного и Остатка, которым при обычных целочисленных вычислениях пренебрегают.

• Длина Делимого всегда в ДВА раза больше, чем у Делителя. Причем старшая часть Делимого находится либо в регистре АН, либо в DX.

Эти команды тоже вырабатывают флаги. Но устанавливаются флаги CF=1 и OF=l, если частное НЕ помещается в регистры AL или АХ.

Здесь, в отличие от команд умножения, может генерироваться

ПРЕРЫВАНИЕ "Деление на ноль”.

Соседние файлы в папке Файлы преподавателя (наиболее достойные)