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.