Вычитание двоичных чисел без знака

Как и при анализе операции сложения, проанализируем процессы, происходящие при выполнении операции вычитания:

· если уменьшаемое больше вычитаемого, то разность положительная, результат верен.

· если уменьшаемое меньше вычитаемого, результат меньше 0, а это уже число со знаком. В этом случае результат необходимо откорректировать. После команды вычитания чисел без знака нужно анализировать флаг сf. Если сf=1, то произошел заем из старшего разряда, и результат получился в дополнительном коде.

К командам вычитания относятся следующие:

· DEC операнд – операция декремента, то есть уменьшения операнда на 1;

· SUBоперанд1,операнд2 – команда вычитания с принципом действия: операнд1=операнд1–операнд2;

· SBB операнд1,операнд2 – команда вычитания с принципом действия: операнд 1=операнд 1–операнд 2– сf.

Рассмотрим пример программной обработки ситуации при вычитании чисел без знака

xor ax,ax

mov al,5

sub al,10

jnc m1 ; нет переноса ?

neg al ; в al – модуль результата

m1:

С указанными для этой команды вычитания исходными данными результат получается в дополнительном коде (отрицательный). Чтобы преобразовать результат к нормальному виду (получить его модуль), применяется команда neg, с помощью которой получается дополнение операнда. В нашем случае мы получили дополнение дополнения, или модуль отрицательного результата. Тот факт, что число отрицательное, отражен в состоянии флага cf.