Вычитание на таком устройстве осуществляется в 2 этапа:
-
меняется знак у вычитаемого — 2-го операнда или источника (иначе говоря, вычитаемое обращается);
-
складываются уменьшаемое и обращенное вычитаемое.
Для обращения операнда в системе команд имеется самостоятельная команда
NEG приемник.
Эта команда вычитает значение операнда-приемника из 0 и, тем самым, формирует дополнительный код операнда.
Команды вычитания SUB и SBB аналогичны соответствующим командам сложения, только при вычитании флаг CF понимается как признак заема.
SUB приемник, источник– (приемник = приемник — источник)
SBB приемник, источник – (приемник = приемник — источник — перенос_заем)
Как и в случае сложения, команда SUB вычитает числа размером в байт или слово, а также младшие байты чисел повышенной точности. Совокупность команд SUB и SBB позволяет вычитать операнды повышенной точности (двойное слово).
Ограничение при вычитании – нельзя вычесть значение регистра или ячейки памяти из константы, поскольку, например, команда SUB 100, AL недопустима. Однако, если заменить недопустимую операцию 2-мя следующими
NEG AL
ADD AL, 100
то вычитание из непосредственного значения будет выполнено и результат получен в AL.
Аналогично сложению, корректируются результаты вычитания при операциях с BCD-числами. Операция AAS корректирует результат вычитания неупакованной десятичной цифры из другой неупакованной десятичной цифры. Команда не имеет операндов и работает с регистром AL по следующему алгоритму:
1) если значение в регистре меньше или равно 9, то флаг CF устанавливается в 0 и управление передается следующей команде;
2) если значение в регистре AL больше 9,
а) из содержимого младшей тетрады этого регистра вычитается 6,
б) обнуляется старшая тетрада регистра AL;
в) флаг CF устанавливается в 1, тем самым, фиксируя наличие заема из предыдущего воображаемого разряда.