Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Программир на ассемблере.doc
Скачиваний:
8
Добавлен:
17.09.2019
Размер:
605.7 Кб
Скачать

7.2.3. Команды сравнения

Команды сравнения очень похожи на соответствующие команды вычитания. Единственное их отличие заключается в том, что результат вычитания операндов нигде не запоминается. Следовательно, данные команды производят так называемое неразрушающее сравнение операндов.

7.2.3.1. CMP - сравнение

Команда CMP - сравнение - фактически вычитает второй операнд из первого, но содержимое операндов не изменяется.

Имеет следующие форматы:

1) CMP reg, mem

2) CMP mem, reg

3) CMP reg1, reg2

4) CMP mem/reg, data

5) CMP ac, data

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

Имеются две команды умножения: для без знаковых и знаковых чисел.

7.2.4.1. MUL - беззнаковое умножение

Команда MUL - беззнаковое умножение - имеет обобщенное представление:

MUL src

ext:ac := (ac) * (src)

ext - расширение

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

Команда имеет два варианта: 8 - битовое и 16 - битовое умножение.

Для 8 - битового умножения множимое должно находится в регистре AL (аккумуляторе), а множитель в регистре или в памяти. Произведение получается в регистре AX.

Для 16 - битового умножения множимое должно находится в регистре AX, а множитель в регистре или в памяти. Произведение получается в регистровой паре DX:AX. В этой операции расширением аккумулятора AX является регистр DX.

Команда MUL имеет два формата:

1) MUL reg

2) MUL mem

7.2.4.2. Imul - умножение знаковых величин

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

7.2.5. Команды деления

Имеются две команды деления: для без знаковых и знаковых чисел.

7.2.5.1. DIV - беззнаковое деление

Команда DIV - беззнаковое деление - имеет обобщенное представление:

DIV src

ac := guot ((ext:ac) / (src))

ext := rem ((ext:ac) / (src)),

где ас - аккумулятор;

ext - расширение;

guot - частное;

rem - остаток.

Эта команда имеет 2 варианта: для 8-ми и 16-ти битного делителя.

Левый бит рассматривается как бит данных, а не как знаковый бит.

Для 8-ми битового делителя делимое должно находиться в регистре АХ. Частное от деления получается в регистре AL, а остаток в регистре AH.

Для 16-ти битового делителя делимое должно находиться в регистровой паре DX:AX. Частное от деления получается в регистре АХ, а остаток - в регистре СХ.

Команда DIV имеет 2 формата:

1) DIV reg

2) DIV mem

Если частное превышает разрядность аккумулятора (больше FF или FFFF) или делитель является 0, то генерируется прерывание типа 0 по адресу 0000:0002.

7.2.5.2. Idiv - деление знаковых величин

Команда IDIV - деление знаковых величин - осуществляет практически такие же действия, что и команда DIV, но делимое, делитель, частное и остаток считаются знаковыми числами.

ЗНАКИ

Делимое

Делитель

Частное

Остаток

+

+

+

+

+

-

-

+

-

+

-

-

-

-

+

-

К подгруппе команд деления принадлежат две команды преобразования.

7.2.5.3. CBW - преобразование байта в слово

Команда CBW - преобразование байта в слово - расширяет (копирует) знак содержимого регистра AL в регистр AH и имеет код 98.

7.2.5.4. CWD - преобразования слова в двойное слово

Команда CWD - преобразования слова в двойное слово - передает знак содержимого регистра АХ во все биты DX и имеет код 99.

Команды CBW и CWD удобно использовать для превращения делимого одинарной длины в делимое двойной длины, что необходимо для правильного выполнения операции деления.