Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_po_Arkht_EVM_i_Yazyk_assemblera.docx
Скачиваний:
61
Добавлен:
01.04.2022
Размер:
5.16 Mб
Скачать

Арифметические команды. Принцип работы.

  1. add операнд_1, операнд_2 — команда сложения с принципом действия: операнд_1 = операнд_1 + операнд_2

Операнды должны иметь одинаковый размер. Результат помещается на место первого операнда. Возможные сочетания операндов для этой команды аналогичны команде MOV.

Примеры:

add ax,5     ;AX = AX + 5

add dx,cx   ;DX = DX + CX

add dx,cl    ;Ошибка: разный размер операндов

  1. xadd назначение, источник — обмен местами и сложение.

Команда позволяет выполнить последовательно два действия:

• обменять значения назначение и источник;

• поместить на место операнда назначение сумму:

назначение = назначение + источник.

  1. inc операнд — операция инкремента, то есть увеличения значения операнда на 1: операнд = операнд +1

inc ax     ;AX = AX + 1

  1. sub операнд_1, операнд_2 — команда вычитания; ее принцип действия: операнд_1 = операнд_1 – операнд_2

Операнды должны иметь одинаковый размер. Результат помещается на место первого операнда. Возможные сочетания операндов для этой команды аналогичны команде MOV.

На самом деле вычитание в процессоре реализовано с помощью сложения. Процессор меняет знак второго операнда на противоположный, а затем складывает два числа.

Примеры:

sub ax,13   ;AX = AX - 13

sub ax,bx   ;AX = AX + BX

sub bx,cl    ;Ошибка: разный размер операндов.

  1. sbb операнд_1, операнд_2 — команда вычитания с учетом заема (флага cf): операнд_1 = операнд_1 – операнд_2 – значение_cf. Флаг cf выполняет роль индикатора заема 1 из старшего разряда при вычитании чисел.

  2. dec операнд — операция декремента, то есть уменьшения значения операнда на 1;

dec ax    ;AX = AX - 1

  1. neg операнд — отрицание с дополнением до двух. Команда выполняет инвертирование значения операнд.

операнд = 0 – операнд, то есть вычитает операнд из нуля.

Команду neg операнд можно применять:

• для смены знака;

• для выполнения вычитания из константы.

Логика работы команды:

<Операнд> = – < Операнд >

В качестве декремента допустимы регистры и память: reg, mem.

Примеры:

neg ax       ;AX = -AX

  1. mul сомножитель_1 – умножение чисел без знака.

В команде указан всего лишь один операнд-сомножитель. Второй операнд — сомножитель_2 задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Так как в общем случае результат умножения больше, чем любой из его сомножителей, то его размер и местоположение должны быть тоже определены однозначно.

Размер операнда

Множитель 

Результат

1 байт

AL

AX

2 байта

AX

DX:AX

4 байта

EAX

EDX:EAX

Примеры:

mul bl   ;AX = AL * BL

mul ax ;DX:AX = AX * AX

Если старшая часть результата равна нулю, то флаги CF и ОF будут иметь нулевое значение. В этом случае старшую часть результата можно отбросить.

  1. Для умножения чисел со знаком предназначена команда:

Imul операнд_1[,операнд_2,операнд_3].

Эта команда выполняется так же, как и команда mul. Отличительной особенностью команды imul является только формирование знака.

  1. С одним операндом — форма, аналогичная команде MUL. В качестве операнда указывается множитель. Местоположение другого множителя и результата определяется по таблице.

  2. С двумя операндами — указываются два множителя. Результат записывается на место первого множителя. Старшая часть результата в этом случае игнорируется. Кстати, эта форма команды не работает с операндами размером 1 байт.

  3. С тремя операндами — указывается положение результата, первого и второго множителя. Второй множитель должен быть непосредственным значением. Результат имеет такой же размер, как первый множитель, старшая часть результата игнорируется. Это форма тоже не работает с однобайтными множителями.

Примеры:

imul cl ;AX = AL * CL

imul bx,ax ;BX = BX * AX

imul cx,-5        ;CX = CX * (-5)

imul dx,bx,134h  ;DX = BX * 134h

C = O = 0, если произведение помещается в младшей половине результата, иначе C = O = 1. Для второй и третьей формы команды C = O = 1 означает, что произошло переполнение.

  1. Для деления чисел без знака предназначена команда: div делитель

Делитель может находиться в памяти или в регистре и иметь размер 8, 16 или 32 бит. Местонахождение делимого фиксировано и так же, как в команде умножения, зависит от размера операндов. Результатом команды деления являются значения частного и остатка.

Размер операнда (делителя)

Делимое

Частное

Остаток

1 байт

AX

AL

AH

2 байта

DX:AX

AX

DX

4 байта

EDX:EAX

EAX

EDX

При выполнении команды DIV может возникнуть прерывание (в данном курсе прерывания мы рассматривать не будем поэтому старайтесь избегать таких случаев):

  • если делитель равен нулю;

  • если частное не помещается в отведённую под него разрядную сетку (например, если при делении слова на байт частное больше 255).

Примеры:

div cl   ;AL = AX / CL, остаток в AH

div di   ;AX = DX:AX / DI, остаток в DX

11)NOP – ничего не делающая команда.

12)Сложение и вычитание с переносом. В системе команд процессоров x86 имеются специальные команды сложения и вычитания с учетом флага переноса (CF). Для сложения с учётом переноса предназначена команда ADC, а для вычитанияSBC. В общем, эти команды работают почти так же, как ADD и SUB, единственное отличие в том, что к младшему разряду первого операнда прибавляется или вычитается дополнительно значение флага C.

Логика работы команд:

ADC: <Приемник> = <Приемник> + <Источник> + С

SBC: <Приемник> = <Приемник> - <Источник> + С

Эти команды позволяют выполнять сложение и вычитание многобайтных целых чисел, длина которых больше, чем разрядность регистров процессора (в нашем случае 16 бит). Принцип программирования таких операций очень прост — длинные числа складываются (вычитаются) по частям. Младшие разряды складываются (вычитаются) с помощью обычных команд ADD и SUB, а затем последовательно складываются(вычитаются) более старшие части с помощью команд ADC и SBB. Так как эти команды учитывают перенос из старшего разряда, то мы можем быть уверены, что ни один бит не потеряется. Этот способ похож на сложение(вычитание) десятичных чисел в столбик. На рисунке ниже показано отличие операции ADC от ADD (CF - C Flag)