Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ЭВМ и ПУ.doc
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
1.16 Mб
Скачать

2.5.2.1. Команды сложения.

В системе команд существует три команды сложения: ADD, ADC, INC.

ADD - команда сложения, один из операндов которой может находиться в регистре или в самой команде (непосредственный операнд)

ADC - команда сложения с переносом, аналогична ADD, но использует в качестве третьего слагаемого начальное значение CF.

INC - команда увеличения на единицу, имеет один операнд. Прибавляет 1 к содержимому операнда и помещает результат в этот же операнд (не устанавливает флаг CF). INC идентична ADD с непосредственным операндом 1, но требует меньше байт в памяти.

Форматы команды ADD:

ADDreg/mem,imn

ADD reg, reg/ mem

ADD mem/ reg, reg,

где reg - имя регистра, mem - имя ячейки памяти, imn - непосредственное значение размером 8, 16 или 32- разряда:

Начиная с микропроцессора 80386 введены следующие форматы:

ADDreg/mem16,imn8

ADD reg/ mem 32, imn 8 (расширение недостающих разрядов знаком).

2.5.2.2.Команды вычитания.

Команды вычитания SUB, SBB, DEC аналогичны командам ADD, ADC, INC, только производят операцию вычитания, а не сложения.

Команда CMP аналогична команде SUB, но результат не запоминается в приемнике, а устанавливаются только флаги в соответствии с результатом. CMP - это команда сравнения, после которой обычно следует команда условного перехода. Состояние флагов после выполнения команды CMP приведено в таблице 2.7.

Таблица 2.7. Состояние регистра флагов после выполнения команды CMP

Знаковые

Беззнаковые

приемник>источника

ZF=0SF=OF

CF=0ZF=0

приемникисточника

SF=OF

CF=0

приемник=источника

ZF=1

ZF=1

приемникисточника

ZF=1SFOF

CF=1ZF=1

приемник<источника

SFOF

CF=1

Команда NEG изменяет знак своего операнда, то есть вычитает значение операнда-приёмника из 0 и тем самым формирует его дополнение до двух. Полезна для вычитания значения регистра или ячейки памяти из непосредственного значения.

Пример:

SUB 100, AL - запрещена

Можно сделать следующее:

NEGAL

ADDAL, 100

NEG - даёт дополнительный код операнда

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

Умножение двух однобайтовых чисел может дать произведение длиной в слово. Аналогично умножение двух слов может дать результат длиной в двойное слово, а умножение двух двойных слов может дать результат длиной в учетверенное слово. Приведенный пример иллюстрирует данное утверждение.

1

1

1

1

1

1

1

1

8 бит

1

1

1

1

1

1

1

1

8 бит

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

0

0

0

0

0

0

0

0

1

16 бит

При умножении двух байтов командой MUL произведение будет находиться в регистрах AH (старший байт) и AL (младший байт), при умножении двух слов произведение будет находиться в регистрах DX (старшее слово) и AX (младшее слово), , а при умножении двух двойных слов произведение будет находиться в регистрах EDX и EAX.

Команда деления DIV делит 16-битовое число из регистра AX (или 32-битное число из регистров DX и AX, или 64-битное число из регистров EDX, EAX) на операнд половинного размера, определяемый в команде. Частное помещается в регистр AL (AX, EAX), а остаток в AH (DX, EDX). Для знаковых чисел требуются специальные команды умножения и деления (IMUL и IDIV).

Форматы команд умножения и деления приведены в таблице 2.8:

Таблица 2.8. Общие форматы команд умножения и деления.

Операнд

Слово

Байт

AX (AL) с регистром

КОП BX

КОП CL

AX (AL) с памятью

КОП MEMW

КОП MEMB

КОП: MUL, IMUL, DIV, IDIV.

В микропроцессоре 80286 команда IMUL имеет ещё один дополнительный формат: разрешается определить множитель как непосредственный операнд. При этом множимое не обязательно должно быть в регистре AX (AL), а может находиться в любом шестнадцатиразрядном регистре или 16-битной ячейке памяти. Результат длиной только 16 бит допускается разместить в любом шестнадцатиразрядном регистре.

Примеры:

Слово в регистре IMUL DX, BX, 115; BX * 115 DX

Слово в памяти IMUL CX, MEMW, 632; MEMW * 632 CX

Начиная с микропроцессора 80386 добавляются следующие форматы команды IMUL:

Двухоперандные:

IMUL reg16, imn 8;

IMULreg16,imn16;

IMUL reg 32, imn 8;

IMUL reg 32, imn 32;

IMULreg16,reg/mem16.

Cтаршая часть произведения теряется.

Трехоперандные:

IMUL reg 16, reg/ mem 16, imn 8/ 16;

IMUL reg 32, reg/ mem 32, imn 8/ 32.

Cтаршая часть произведения теряется.

Однооперандные:

Второй операнд и приемник в регистрах AL, AX, EAX.

IMULreg/mem(8/ 16/ 32-бита)

Команды умножения и деления действуют так, чтобы результат двойной длины при умножении можно было использовать в последующем делении. Если требуется поделить два числа одинакового размера, то в этом случае необходимо искусственно увеличить размер делимого. Если число без знака, то можно просто обнулить содержимое регистра AH, а если число со знаком, то 8-битное число должно быть преобразовано в 16-битное, 16-битное - в 32-битное и 32-битное в 64-битное. Для проведения операций расширения знака числа в микропроцессоре существуют специальные команды: CBW , CWD, CWDE, CDQ.