Skip to content

11. Арифметические команды.

Natasha Gurova edited this page Jun 24, 2022 · 8 revisions
Clone this wiki locally

ADD

add <приемник>, <источник> 

Aрифметическое сложение приемника и источника. Сумма помещается в приемник, источник не меняется.

Приемник:

  • переменная (область памяти),
  • РОН (регистр общего назначения)

Источник:

  • переменная (область памяти),
  • РОН (регистр общего назначения)
  • число (непосредственный операнд)

❗️ Переменную с переменной складывать нельзя

SUB

sub <приемник>, <источник> 

Арифметическое вычитание источника из приемника

Источник и Приемник аналогичны сложению.

MUL

mul <источник> 

Беззнаковое умножение. Умножаются источник и AL/AX, в зависимости от размера источника. Результат помещается в AX либо DX:AX.

Если ЧИСЛО - это БАЙТ, то AX = AL * ЧИСЛО
Если ЧИСЛО - это СЛОВО, то (DX AX) = AX * ЧИСЛО

Источник:

  • переменная (область памяти),
  • РОН (регистр общего назначения)

DIV

div <источник> 

Целочисленное беззнаковое деление. Делится AX/DX:AX на источник. Результат помещается в AL/AX, остаток – в AH/DX.

Если источник - БАЙТ, то AL = AX / источник. 
Если источник - СЛОВО, то AX = DX:AX / источник

Источник аналогичен mul

INC DEC

inc <приемник> 
dec <приемник> 

Инкремент/декремент на 1

В отличие от add/sub:

  • работают быстрее (т.к. занимают 1 байт, а не 3)
  • не затрагивают флаг CF

Меняют регистр флагов (FLAGS), в зависимости от результата


ADC SBB

adc <приемник>, <источник> 
sbb <приемник>, <источник> 

Сложение/вычитание с учетом флага CF (флаг переполнения).

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

add ax, cx         ; Сложили младшие разряды двух чисел
adc dx, bx         ; Сложили старшие и прибавили к ним флаг CF
                   ; В паре регистров DX:AX будет искомая сумма

IMUL

imul <источник>
imul <приемник>, <источник>                    ; нет в 8086
imul <приемник>, <источник1>, <источник2>      ; нет в 8086

Умножение чисел со знаком.

imul cl                                         ; ax = al * cl
imul bx, ax                                     ; bx = bx * ax
imul cx, -5                                     ; cx = cx * (-5)
imul dx, bx, 134h                               ; dx = bx * 134

IDIV

idiv <источник> 

Целочисленное деление со знаком (результат округляется в сторону нуля, знак остатка совпадает со знаком делимого)

mov AX, 506                                    ;Делимое
mov BL, 50                                     ;Делитель
idiv BL                                        ;AL = 0Ah (частное), AH = 06h (остаток)

NEG

не знаю, насколько эта команда относится к арифметическим, но пусть будет

neg <приемник> 

Команда изменения знака (переводит число в доп код и прибавляет к нему единичку).

? Когда требуется поменять знак?
  Например нам нужно выводить числа на экран. Для этого мы сначала должны определить знак, 
  вывести его, а потом вывести само число.