Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
Арифметические машинные команды (и соответствующие операторы) делятся на двоичные и двоично-кодированные десятичные. Второй из этих классов используется редко, т.к. применяемый в нем способ кодирования данных неэффективен по затратам памяти .
В свою очередь, двоичные арифметические операторы разделяются на знаковые и беззнаковые. Первые из них выполняют операции, как над положительными, так и над отрицательными двоичными числами, в то время как беззнаковые операторы имеют дело только с положительными числами. Рассмотрим основные типы операторов ассемблера, выполняющие операции над двоичными числами.
Сложение:
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.
Предыдущий раздел | В начало | Следующий раздел |