Сложение двоичных чисел со знаком

На самом деле микропроцессор не подозревает о различии между числами со знаком и без знака. Вместо этого у него есть средства фиксирования возникновения характерных ситуаций, складывающихся в процессе вычислений. Некоторые из них мы рассмотрели при обсуждении сложения чисел без знака:

§ флаг переноса 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

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: