11. Арифметические команды. - mRrvz/bmstu-asm GitHub Wiki
ADD <приемник>, <источник> — сложение. Не делает различий между знаковыми и беззнаковыми числами.
ADC <приемник>, <источник> — сложение с переносом. Складывает приёмник, источник и флаг CF.
SUB <приемник>, <источник> — вычитание. Не делает различий между знаковыми и беззнаковыми числами.
SBB <приемник>, <источник> — вычитание с займом. Вычитает из приёмника источник и дополнительно - флаг CF.
Флаг CF можно рассматривать как дополнительный бит у результата.
.
Можно использовать ADC и SBB для сложения вычитания и больших чисел, которые по частям храним в двух регистрах.
Пример: Сложим два 32-битных числа. Пусть одно из них хранится в паре регистров DX:AX (младшее двойное слово - DX, старшее AX). Другое в паре BX:CX
add ax, cx
adc dx, bx
Если при сложении двойных слов произошел перенос из старшего разряда, то это будет учтено командой adc.
Эти 4 команды (ADD, ADC, SUB, SBB) меняют флаги: CF, OF, SF, ZF, AF, PF
MUL <источник> — выполняет умножение чисел без знака. <источник> не может быть число (нельзя: MUL 228). Умножает регистр AX (AL), на <источник>. Результат остается в AX, либо DX:AX, если не помещается в AX.
IMUL — умножение чисел со знаком.
- IMUL <источник>. Работает так же, как и MUL
- IMUL <приёмник>, <источник>. Умножает источник на приемник, результат в приемник.
- IMUL <приёмник>, <источник1>, <источник2>. Умножает источник1 на источник2, результат в приёмник.
Флаги: OF, CF
DIV <источник> — выполняет деление чисел без знака. <источник> не может быть число (нельзя: DIV 228). Делимое должно быть помещено в AX (или DX:AX, если делитель больше байта). В первом случае частное в AL, остаток в AH, во втором случае частное в AX, остаток в DX.
IDIV <источник> — деление чисел со знаком. Работает так же как и DIV. Окруление в сторону нуля, знак остатка совпадает со знаком делимого.
INC <приемник> — увеличивает примник на 1.
DEC <приемник> — уменьшает примник на 1.
Меняют флаги: OF, SF, ZF, AF, PF
NEG <применик> — меняет знак приемника.