DIV, IDIV деление операндов




DEC уменьшениt содержимого приемника на единицу

Команда DEC (decrement - уменьшить) вычитает 1 из содержимого регистра или ячейки памяти, но при этом (в отличие от команды SUB) не воздействует на флаг переноса CF. Команда DEC часто используется в циклах для уменьшения значения счетчика до тех пор, пока оно не станет нулевым или отрицательным. Ее можно использовать также для уменьшения значения индексного регистра или указателя при доступе к последовательно расположенным ячейкам памяти. Например:

DEC CX;Уменьшить значение 16-битового

DEC AL; или 8-битового регистра

DEC MEM_BYTE;Уменьшить значение байтовой ячейки памяти

DEC MEM_WORD[BX];или слова памяти.

CMP сравнениt значений источника и приемника

 

Большая часть программ выполняет команды вовсе не в том порядке, в котором они хранятся в памяти. Обычно в программах есть переходы, циклы вызовы процедур и другие команды, заставляющие микропроцессор передавать управление от одной последовательности команд к другой. Эта передача управления происходит при выполнении или невыполнении определенных условий, например равенстве или неравенстве операнда какому либо значению. Выполнение условий фиксируется микропроцессором в регистре флагов. А команда СМР (compare - сравнить), обычно используется для изменения состояния флагов, на основании которых команды передачи управления "принимают решение" передавать или не передавать управление.

Подобно команде SUB команда СМР вычитает операнд-источник из операнда-приемника и в зависимости от результата устанавливает или обнуляет флаги Но в отличие от команды SUB команда СМР не сохраняет результат вычитания. Формат команды:

CMP приемник,источник

Другими словами, команда СМР не изменяет операнды. Она целиком предназначена для установки значений флагов, на основании которых команды условного перехода будут "принимать решение" о передаче управления.

MUL, IMUL умножение опреандов

Команда MUL (multiply - умножить) умножает числа без знака, a IMUL (integer multiply - умно­жить целые числа) - числа со знаком. Обе команды могут умножать как байты, так и слова.

Эти команды имеют следующий формат:

MUL источник

IMUL источник

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

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

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

То есть размер n – битных сомножителей равен 2n.

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

Несколько примеров умножения:

MUL BX;Умножить ВХ на АХ без знака

MUL MEM_BYTE;Умножить содержимое ячейки памяти на AL без знака

IMUL DL;Умножить DL на AL со знаком

IMUL MEM_WORD;Умножить содержимое ячейки памяти на АХ со знаком

Команды MUL и IMUL не дозволяют в качестве операнда использовать непос­редственное значение. Такое значение- перед умножением надо загрузить в ре­гистр или в ячейку памяти. Например, в результате исполнения команд

MOV DX,1O

MUL DX

содержимое регистра АХ будет умножено на 10.

DIV, IDIV деление операндов

Команда DIV (divide - разделить) выполняет деление чисел без знака, а команда IDIV (integer divide - разделить целые числа) выполняет деление чисел со знаком. Эти команды имеют формат

DIV источник

IDIV источник

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

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

регистр AL, а остаток в регистр АН.

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

регистр АХ, а остаток - в регистр DX.

Обе команды оставляют состояние флагов неопределенными, но если частное не помещается в регистре-приемнике (AL или АХ), то микропроцессор генерирует прерывание типа 0 (деление на 0).

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

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

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

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

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

5. При делении слов со знаком частное лежит вне диапазона от -32768 до 32767. Приведем несколько типичных примеров операций деления:

Несколько примеров операций деления:

DIV BX;Разделить DX:AX на ВХ, без знака;

DIV MEM_BYTE;Разделить АХ на байт памяти, без знака;

IDIV DL;Разделить АН:AL на DL со знаком;

IDIV MEM WORD;Разделить DX:AX на слово памяти, со знаком.

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

MOV BX,2O

DIV ВХ

разделят объединенное содержимое регистров DX и АХ на 20.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: