В этом ответе на связанный вопрос есть пример кода на C, который показывает, как вычитать с помощью сложения. Код также устанавливает флаги переноса и переполнения и содержит простой «тест», который добавляет и вычитает несколько чисел и печатает результаты. Числа 8-битные.
РЕДАКТИРОВАТЬ: Формальное доказательство того, что можно использовать ADD вместо SUB для целых чисел без знака AND определить переполнение / недополнение без знака, как будто из SUB.
Допустим, мы хотим вычислить a - b
, где a
и b
являются 4-битными целыми числами без знака, и мы хотим выполнить вычитание с помощью сложения и получить 4-битную разность и индикацию переполнения / переполнения, когда a .
a - b = a + (-b)
Поскольку мы работаем по арифметике по модулю 16, -b
= 16-b
. Таким образом,
a - b = a + (-b) = a + (16 - b)
Если мы выполняем обычное добавление без знака a
и 16-b
, условие переполнения для этого добавления, которое часто указывается процессором в его флаге carry
, будет таким (напомним, что мы имеем дело с 4 -битные целые числа):
a + (16 - b)> 15
Давайте упростим это условие переполнения:
а + 16 - б> 15
+ 16> 15 + B
а + 1> б
а> б - 1
Давайте теперь вспомним, что мы имеем дело с целыми числами. Поэтому вышесказанное можно переписать так:
a> = b .
Это условие для получения флага переноса = 1 после добавления a
и (16)-b
. Если неравенство не выполняется, мы получаем carry = 0.
Давайте теперь вспомним, что нас интересовало переполнение / понижение из вычитания (a - b). Это условие a .
Ну, a> = b является полной противоположностью a .
Из этого следует, что флаг carry
, полученный при добавлении a
и (16)-b
, является обратной величиной переполнения вычитания, или, другими словами, обратной borrow
флаг, который вы получите, вычитая b
непосредственно из a
, используя соответствующую инструкцию вычитания (например, SUB).
Просто переверните носитель или обращайтесь с ним наоборот.