Команды сложения и вычитания. Операции сложения и вычитания одинаково для знаковых и беззнаковых целых
Операции сложения и вычитания одинаково для знаковых и беззнаковых целых. Используются две формы операндов: байт или слово, причем операнды должны быть одинаковой длины. Операнды могут храниться в регистре или в ОП, но второй операнд может быть непосредственным.
Перечислим команды, относящиеся к группе команд сложения и вычитания:
а) ADD op1, op2 ; op1 := op1+op2
SUB op1, op2 ; op1 := op1 – op2
Сложение (вычитание) операндов в дополнительном двоичном коде, результат помещается на место первого операнда, второй операнд не изменяется.
Команда модифицирует регистр флагов FLAGS в соответствии с результатом операции, а именно:
ZF – нулевой рез-т,
SF – знак результата,
PF – флаг четности,
CF, AF – флаги переносов,
OF – флаг переполнения.
Примеры:
ADD AH, 12 ; AH := AH + 12 (1Б)
SUB z, BX ; z := z – BX (2Б)
б) ADC op1, op2 ; op1 := op1+op2+CF
SBC op1, op2 ; op1 := op1 – op2 – CF
Сложение (вычитание) операндов с переносом, образованным предыдущей командой.
Модифицирует флаги аналогично п.(а).
Например, если требуется сложить двойные слова, расположенные в парах регистров
(AX, BX) := (AX, BX) + (CX, DX),
причем AX, CX – старшие байты слагаемых,
BX, DX – младшие байты.
Сложение выполняется двумя командами:
ADD BX, DX
ADC AX, CX
в) Специальный случай сложения – изменение операнда на единицу.
INC op ; op:= op +1 инкремент
DEC op ; op:= op –1 декремент
г) Десятичная коррекция результата предыдущей операции. Это анализ флагов и преобразование результата сложения (вычитания) BCD-кодов. BCD-операнды обрабатываются обычными командами сложения и вычитания, а затем размещается команда десятичной коррекции.
Команда коррекции обрабатывает только однобайтовый операнд, находящийся в AL, поэтому команды десятичной коррекции операнда не имеют (подразумеваемая адресация).
DAA; коррекция после сложения
DAS; коррекция после вычитания.
Например,
ADD AL, y
DAA
SUB AL, DH
DAS
Примечание: BCD-операнды, представленные более, чем одним байтом должны обрабатываться побайтно.
Команды десятичной коррекции модифицирует флаги аналогично п.(а), за исключением флагов AF и OF.
Дополнительные команды
а) Команда сравнения
CHP op 1, op 2; op 1 - op2
Результат нигде не запоминается.
Цель команды – модификация флагов: ZF, SF,PF,CF,AF,OF.
б) Команда изменения знака
NEG op
Операнд может быть байт или слово в регистре или в ячейке памяти.
Пример,
MOV AH, 12
NEG AH ; AH := -12
Если операнд равен нулю, то его значение не изменяется.
Команда модифицирует флаги аналогично п.(а), причем
CF=1, кроме случая, когда операнд равен нулю;
OF=0, кроме случая, когда op=-128 (для 1Б), тогда OF=1, а операнд остается без изменения.