На самом деле микропроцессор не подозревает о различии между числами со знаком и без знака. Вместо этого у него есть средства фиксирования возникновения характерных ситуаций, складывающихся в процессе вычислений. Некоторые из них мы рассмотрели при обсуждении сложения чисел без знака:
§ флаг переноса cf, установка которого в 1 говорит о том, что произошел выход за пределы разрядности операндов;
§ команду adc, которая учитывает возможность такого выхода (перенос из младшего разряда).
Другое средство — это регистрация состояния старшего (знакового) разряда операнда, которое осуществляется с помощью флага переполнения of в регистре eflags (бит 11).
Ситуация переполнения (установка флага of в 1) происходит при переносе:
§ из 14-го разряда (для положительных чисел со знаком);
§ из 15-го разряда (для отрицательных чисел).
И наоборот, переполнения не происходит (то есть флаг of сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах.
Итак, переполнение регистрируется с помощью флага переполнения of. Дополнительно к флагу of при переносе из старшего разряда устанавливается в 1 и флаг переноса cf. Так как микропроцессор не знает о существовании чисел со знаком и без знака, то вся ответственность за правильность действий с получившимися числами ложится на программиста. Проанализировать флаги cf и of можно командами условного перехода jc\jnc и jo\jno соответственно.
|
|
Что же касается команд сложения чисел со знаком, то они те же, что и для чисел без знака.
!!! В операции сложения должны участвовать операнды одного формата (b-b, w-w)
!!! Возможны сочетания
регистр - регистр
память - регистр
регистр - память
регистр - непосредственный операнд
непосредственный операнд – регистр
память – память (!!! выполняется через промежуточный регистр)
Пример1 Вычисление суммы двух чисел
...slag1 dw 250slag2 dw 125rez dw?...mov ax,slag1add ax,slag2mov rez,ax...Пример2. Увеличение числа на 1
Mov ax,slag1inc axmov rez,ax.
Пример 3. Вычисление суммы чисел
masm model small stack 256.data a db 254.code main: mov ax,@data mov ds,ax... xor ax,ax add al,17 add al,a;результат сложения выходит за границы операнда jnc m1;проверяет сост-ие флага cf - если нет переноса; то перейти на m1 adc ah,0;в ax сумма с учетом переноса в старший разряд m1:... exit: mov ax,4c00h;стандартный выход int 21h end main