Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12-12-2013_11-21-32 / пособие_m.doc
Скачиваний:
76
Добавлен:
10.05.2015
Размер:
484.35 Кб
Скачать
    1. Команды двоичной арифметики

К командам двоичной арифметики в первую очередь относятся команды сложения. Имеется четыре различных команды сложения и первая из этих команд – команда ADD. При выполнении этой команды происходит сложение операндов, которые находятся в приемнике и источнике, и результат помещается в приемник.

add dst, src (dst) = (dst) + (src).

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

add reg/mem, imm;

add reg, reg/mem;

add reg/mem, reg;

add reg/mem16, imm8;

add reg,mem32, imm8.

В двух последних форматах размер непосредственного операнда меньше размера приемника и для получения правильного результата до проведения сложения этот операнд расширяется со знаком до размера приемника.

Команда сложения с переносом ADC отличается от команды ADD тем, что в этой команде к сумме источника и приемника прибавляется еще дополнительно значение флага переноса CF:

adc dst, src (dst) = (dst) + (src) + (CF)

Использование этой команды позволяет осуществить сложение операндов любого размера с соответствующим учетом переносов. Форматы этой команды аналогичны форматам команды ADD.

К командам сложения относится однооперандная команда инкремента INC, т.е. увеличения значения на 1:

inc dst (dst) = (dst) + 1.

Операндами в этой команде могут быть содержимое регистра или памяти:

inc reg/mem.

Последняя команда сложения – XADD осуществляет сложение и обмен. Формат этой команды выглядит следующим образом:

xadd r/m, r.

При выполнении этой команды источник заменяется приемником, а приемник – суммой источника и приемника.

Следующая подгруппа команд арифметики включает команды вычитания. Первая команда вычитания – команда SUB, при помощи которой осуществляется вычитание источника из приемника, а разность помещается на место приемника.

sub dst, src dst = (dst) – (src)

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

sub reg/mem, imm;

sub reg, reg/mem;

sub reg/mem, reg;

sub reg/mem16, imm8;

sub reg/mem32, imm8.

В двух последних командах размер непосредственного операнда меньше размера приемника и для получения правильной разности до осуществления вычитания источник расширяется со знаком до соответствующего размера.

Команда вычитания с заемом SBB отличается от команды SUB тем, что кроме вычитания источника из приемника осуществляется дополнительно вычитание значение флага переноса CF, т.е. осуществляется следующая операция:

sbb dst, src dst = (dst) – (src) – (CF).

При помощи этой команды реализуется вычитание чисел любого размера. Формат команды SBB аналогичен формату команды SUB.

К командам вычитания относится также однооперандная команда декремента DEC, при помощи которой осуществляется уменьшение операнда на 1:

dec dst dst = (dst) – 1.

Операнд может находиться в регистре или ячейке памяти:

dec reg/mem.

Команда образования дополнительного кода числа NEG имеет следующее представление:

neg dst dst = 0 – (dst)

а операнд может находиться в регистре или ячейке памяти:

neg reg/mem.

Команда сравнения CMP похожа на команду вычитания SUB и имеет аналогичные форматы:

cmp dst, src.

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

Среди команд умножения имеются команды умножения знаковых и беззнаковых чисел. Однооперандная команда умножения MUL беззнаковых чисел производит умножение содержимого аккумулятора на адресуемый в команде операнд:

mul src.

Множитель src может быть содержимым регистра или ячейки памяти. В случае умножения байт один множитель находится в регистре AL, а 16-разрядное произведение записывается в регистры AH-AL, т.е. в регистр AX. Если происходит умножение 16-разрядных операндов, то один сомножитель находится в источнике src, а второй – в регистре AX. В этом случае 32-разрядное произведение будет располагаться в регистрах DX-AX. Наконец, при выполнении умножения 32-разрядных операндов один сомножитель находится в источнике src, а второй – в регистре EAX. 64-разрядное произведение будет располагаться в регистрах EDX-EAX.

Команды умножения знаковых чисел IMUL (при этом умножении старшие знаковые разряды не участвуют непосредственно в самом умножении, а используются только для формирования знака произведения) обладают более широкими возможностями по сравнению с командой умножения беззнаковых чисел, допуская задание одного, двух или трех операндов.

Однооперандная команда IMUL полностью идентична описанной команде MUL. Множитель src может быть содержимым регистра или ячейки памяти и имеет разрядность 8, 16 или 32 разряда.

Двухоперандная команда IMUL имеет следующий вид:

imul reg, src

и при выполнении этой команды производится умножение содержимого регистра общего назначения на содержимое источника, которым может быть регистр или ячейка памяти, а также непосредственное значение. Эта команда имеет следующий формат:

imul reg16, imm8;

imul reg16, imm16;

imul reg32, imm8;

imul reg32, imm32;

imul reg16, reg/mem16;

imul reg32, reg/mem32.

При выполнении данной команды произведение помещается в регистр-приемник, а старшая часть результата произведения теряется.

В трехоперандной команде IMUL

imul dst, src,imm dst = (src) x imm

приемником может быть регистр общего назначения, а источником – регистр или ячейка памяти. Формат этой команды имеет следующий вид:

imul reg16,reg/mem16,imm8/16;

imul reg32, reg/mem32, imm8/32.

Таким образом, при выполнении данной команды умножаются второй и третий операнды (константа-байт расширяется со знаком), а произведение помещается на место первого операнда, при этом старшая часть произведения теряется.

Аналогично командам умножения команды деления также могут быть знаковыми и беззнаковыми. Очевидно, что делимое должно иметь двойную длину, а результатом выполнения операции являются частное и остаток.

Команда деления беззнаковых чисел имеет следующий формат:

div src

и эта команда осуществляет деление аккумулятора и его расширения на адресуемый делитель src. Если размер делителя равен 1 байту, то делимое находится в регистрах AH-AL; если размер делителя равен слову, то делимое находится в регистрах DX-AX, а если размер делителя равен двойному слову, то делимое располагается в регистрах EDX-EAX. При выполнении команды частное формируется в аккумуляторе, а остаток – в расширении аккумулятора. Нецелое частное округляется до целого путем отбрасывания дробной части результата.

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

Соседние файлы в папке 12-12-2013_11-21-32