Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

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

Для умножения чисел без знака предназначена команда

MUL источник

Для умножения чисел со знаком предназначена команда

IMUL источник

где источник – регистр общего назначения или ячейка памяти размером в байт или слово. В качестве второго операнда команды MUL и IMUL используют содержимое регистра AL (при операциях над байтами) или регистра AX (при операциях над словами). Произведение имеет двойной размер и возвращается следующим образом:

Умножение байтов и возвращает 16-битовое произведение в регистрах AH (старший байт) и AL (младший байт).

Умножение слов и возвращает 32-битовое произведение в регистрах DX(старшее слово) и AX (младшее слово)

По завершении исполнения этих команд флаги переноса CF и переполнения OF показывают, какая часть произведения существенна для операций.

После исполнения команды MUL флаги CF и OF равны 0, если старшая половина произведения равна 0; в противном случае оба этих флага равны 1. После исполнения команды IMUL флаги CF и OF равны 0, если старшая половина произведения представляет собой лишь расширение знака младшей половины. В противном случае они равны 1.

Команда деления

Команда DIV выполняет деление чисел без знака

DIV источник

Команда IDIV выполняет деление чисел со знаком

IDIV источник

где источник – делитель размером в байт или слово, находящееся в регистре общего назначения или ячейки памяти. Делимое должно иметь двойной размер; оно извлекается из регистров AH и AL (при делении на 8-битовое число) и DX и AX (при делении на 16-битвое число). Результаты возвращаются следующим образом:

Если операнд-источник представляет собой байт, то частное возвращается в регистре AL, а остаток в регистре AH.

Если операнд-источник представляет собой слово, то частное возвращается в регистре AX, а остаток – в регистре DX.

Обе команды оставляют состояние флагов неопределенными, но если частное не помещается в регистре - приемнике (AL или AX), то МП сообщает об этот как “Прерывание типа 0” (деление на 0).

Переполнение результата деления возникает в следующих случаях:

1. Делитель равен 0

2. При делении байтов без знака делимое без знака делимое пол меньшей мере в 256 раз превышает делитель.

3. При делении слов без знака делимое по меньшей мере в 65 536 раз превышает делитель.

4. При делении байтов со знаком частное лежит вне диапазона от –128 до 127 .

5. При делении слов со знаком частное лежит вне диапазона от –32768 до 32767

Пример:

DIV BX ; AX/BX

DIV MEM_BYTE ; AX/MEM_byte

IDIV DL ; AL/DL

Команды DIV и IDIV не позволяют прямо разделить на непосредственное значение; его надо предварительно загрузить в регистр или ячейку памяти.

Команды преобразования

Если операнды, участвующие в арифметических операциях, разные, то в этом случае используются вспомогательные команды.

Существуют два вида команд преобразования типа.

  1. Команды без операндов – эти команды работаю с фиксированными регистрами.:

cbw - команда преобразования байта (в регистре al) в слово (в регистрах ax) путем распространения значения старшего бита ax на все биты регистра ah.

cwd – команда преобразования слова (в регистре dx:ax) путем распространения значения старшего бита ax на все биты регистра dx

cwde – команда преобразования слова (в регистре ax) в двойное слово (в регистре eax) путем распространения значения старшего бита ax на все биты старшей половины регистра eax.

cdq команда преобразования двойного слова (в регистре eax) в учетверенное слово (в регистрах edx:eax) путем распространения значения старшего бита eax на все биты регистра edx.