Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.2.1. Арифметические операторы

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

В свою очередь, двоичные арифметические операторы разделяются на знаковые и беззнаковые. Первые из них выполняют операции, как над положительными, так и над отрицательными двоичными числами, в то время как беззнаковые операторы имеют дело только с положительными числами. Рассмотрим основные типы операторов ассемблера, выполняющие операции над двоичными числами.

Сложение:

add (сложить) суммирует два операнда (слова или байты). Результат записывается на место первого операнда. Примеры:

 

           add      ax, [Mem]            ; (AX) + (Mem) àAX  , Mem - слово в ОП

           add      [Mem], ax            ; (Mem) + (AX) àMem

           add      al, 40                    ; (AL) + 40 à AL  

           add      Mem, 0fh              ; (Mem) + 0fh à Mem

 

Запрещается суммировать содержимое двух ячеек ОП, а также записывать в качестве первого операнда непосредственное значение;

2) adc (сложить с переносом) суммирует два операнда (слова или байты), а также флаг переноса CF. Результат помещается на место первого операнда.

Совместное применение операторов add и adc позволяет выполнить суммирование двух чисел даже тогда, когда результат не вмещается в                  16 битов. Например, следующие два оператора складывают 32-битовое число, находящееся в регистрах CX и DX, с 32-битовым числом, находящемся в регистрах AX и BX. Результат записывается в регистры AX и BX:

 

add   ax, cx         ;  Суммируются младшие 16 битов

adc   bx, dx         ; Суммируются старшие 16 битов, а такж перенос от предыдущего суммирования

 

3) inc ( инкремент) увеличивает операнд на 1. Пример:

inc     ax                  ;  (АХ) + 1 ® АХ

    Операторы вычитания:

4) sub (вычесть) выполняет вычитание второго операнда из первого операнда (операнды - байты или слова). Результат помещается в качестве первого операнда. Примеры:

 

            sub      ax, cx                            ;  (AX) – (CX) à AX

            sub      ax, [Mem]                      ;  (AX) – (Mem) à AX

            sub      [Mem], ax                       ;  (Mem) – (AX) à Mem

            sub      al, 10                            ;  (AL) – 10 àAL

 

Запрещается брать в качестве обоих операндов ячейки ОП, а также задавать в качестве первого операнда непосредственное значение;

   2) dec (декремент уменьшает операнд на 1. Пример:

dec      ax                                  ;  (АХ) – 1 ® АХ

   3) neg (изменить знак) вычитает из нулевого значения значение операнда. Результат записывается на место операнда. Пример:

neg     ax                                  ;   - (АХ)  ®  АХ

  4) cmp (сравнить два операнда) выполняет вычитание 1-го и 2-го операндов, но в отличие от оператора sub результат вычитания никуда не записывается, а лишь используется для установки флажков. Примеры:

 

cmp   ax, bx                           ;  (АХ) – (ВХ)

cmp   [Mem], ah                     ;  (Mem) – (AH)

cmp   al, 10                            ;  (AL) – 10

 

   Операторы умножения:

1) mul (умножить) выполняет умножение двух беззнаковых чисел (слов или байтов). Единственный операнд содержит один из сомножителей и  представляет собой регистр общего назначения или ячейку памяти размером в байт или слово. В качестве второго сомножителя используется содержимое регистра AL (в операциях над байтами) или регистра AX (в операциях над словами).

16-битовое произведение байтов помещается в регистры AH (старший байт) и AL (младший байт). 32-битовое произведение слов помещается в регистры DX (старшее слово) и AX (младшее слово). Примеры:

 

mul    bx                          ;  Умножить  BX  на  AX  без знака

mul    [Mem_wor]          ;Умножить  содержимое ячейки на AX без знака

mul    dl                         ;  Умножить  DL на  AL  без знака

 

2) imul (умножить целые числа) выполняет умножение двух знаковых чисел (слов или байтов). Правило размещения сомножителей и результата аналогично оператору mul.

Операторы деления:

1) div (разделить) выполняет деление чисел без знака. Единственный операнд представляет собой регистр общего назначения или ячейку памяти (байт или слово) и содержит делитель. Делимое должно иметь двойной размер; оно извлекается из регистров AH и AL (при делении на байт) или из регистров DX и AX (при делении на слово).

Результат возвращается следующим образом. Если делитель представляет собой байт, то частное возвращается в регистре AL, а остаток в регистре AH. Если делитель представляет собой слово, то частное возвращается в регистре AX, а остаток в регистре DX. Примеры:

 

div    bx                         ; Разделить  DX:AX  на  BX , без знака

div    [Mem_byte]          ; Разделить  AH:AL  на  байт ОП, без знака

 

2) idiv (разделить целые числа) выполняет деление чисел со знаком. Правило записи делимого, делителя и результата аналогично div.

 


Предыдущий раздел В начало Следующий раздел