Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Если при сложении результат превышает размерность поля операнда, то результат оказывается неверным. Например: 254+5=259 (11111110+0000101=1 00000011). Для фиксирования ситуации выхода за разрядную сетку результата предназначен флаг переноса cf. Поэтому после операции сложения в программе предполагается включение участков кода, в которых анализируется флаг cf. Это можно сделать с помощью команды условного перехода jc <метка>.

 

В системе команд микропроцессора имеются три команды двоичного сложения:

– INC <операнд>; операция инкремента, то есть увеличение значения операнда на 1.

– ADD <операнд_1><операнд_2>;

Принцип действия:

операнд_1=операнд_1+операнд_2.

В этой команде нельзя использовать переменную одновременно и для опернда_1, и для операнда_2. Команда ADD не различает числа со знаком и без знака.

– ADC <операнд_1><операнд_2>; команда сложения с учётом флага переноса cf.

Принцип действия:

операнд_1=операнд_1+операнд_2+значение_cf.

 

Имеющиеся варианты приёмника и источник:

Операнд_1 Операнд_2 пример
регистр регистр add ecx, edx
регистр память add ecx, dword ptr [104h]/add ecx, [edx]
регистр значение add eax, 102
память значение add dword ptr [401231h], 80
память регистр add dword ptr [401231h], edx

Сложим, например, два 64-битных целых числа: одно число находится в регистрах EDX:EAX, а другое в регистрах ЕВХ:ЕСХ:

Add eax,ecx

Adc edx,ebx

Если при сложении младших двойных слов произошел перенос из старшего разряда (флаг CF=1), то он будет учтен следующей командой ADC.

 

Вычислим сумму 254+17 в регистр ах. При этом известно, что результат сложения выходит за границы операнда.

 

– XADD <операнд_1><операнд_2>; выполняет команду «обменять между собой и сложить».

Выполняет сложение, помещает содержимое операнд_1 в операнд_2, — сумму операндов — в операнд_1. Операнд_2 всегда регистр, операнд_1 может быть регистром и переменной.


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

При сложении чисел с одинаковым знаком необходимо учитывать значение флага переполнения of в регистре eflags (бит 11).

Пример1.

30566=0111011101100110

+

00687=0000001010101111

=

31253=0111101000010101 – результат правильный (sf=0; of=0).

Пример2.

30566=0111011101100110

+

30566=0111011101100110

=

61132=1110111011001100 – результат правильный, но значение считается отрицательное (в старшем бите 1, sf=1; of=0).

Пример3.

-30566= 1000100010011010 (дополнительный код)

+

-04875= 1110110011110101 (дополнительный код)

=

-35441<>1 0111010110001111 – результат неправильный, так как получилось положительное число 95 631 (в старшем бите 0, sf=0; of=1).

Для того, чтобы получить правильный ответ необходимо:

а) инвертировать результат: 1000101001110000

б) прибавить 1: 1000101001110000+1=1000101001110001b

35441d

в) или выполнить команду neg(0111010110001111)=1000101001110001b=

=35441d

Пример4. (sf=1; of=1)

-4875= 1110110011110101

+

-4875= 1110110011110101

=

-9750<>1 1101100111101010b (121 322d) – результат неправильный.

Neg(1101100111101010b)=0010011000010110b=9750d


Таким образом, ситуация переполнения при сложении чисел с одинаковым знаком (установка флага of в 1) происходит при переносе:

1) из 14-го разряда (для положительных чисел);

Из 15-го разряда (для отрицательных чисел).

 

Переполнения не происходит (флаг of сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах.

При сложении чисел с одинаковыми знаками может быть следующая ситуация:

1) sf=0; of=0 => в приёмнике результат положительный и правильный;

2) sf=1; of=0 => в приёмнике результат правильный, но он считается отрицательным, так как sf=1. Работать с результатом необходимо как с положительным числом;

3) sf=0; of=1 => в приёмнике результат в дополнительном коде, необходимо применять команду neg и работать с результатом как с отрицательным числом;

4) sf=1; of=1 => в приёмнике результат в дополнительном коде, необходимо применять команду neg и работать с результатом как с отрицательным числом;

 

Правильный процесс сложения чисел со знаком и без знака необходимо проводить, анализируя флаги cf и of. Состояние флагов после выполнения команд ADD, ADC, INC сведено в табл. 1.

Таблица 1.


Сложение чисел с разными знаками

Пример 1: найдём сумму чисел -6+7. Для чисел отведено 2 байта. Для этого -6d (110b) представим в дополнительном коде: 0000000000000110 инвертируем, получим:

+

=

11111111111110102 =6553010 =fffa16 =-6d

Тогда:

mov ax,FFFAh

mov dx, 7h

add ax,dx

+

=

1 0000000000000001b=65537d (sf=0; cf=1)

 

fffah+7h=1 0001h – результат не помещается в регистр АХ, будет установлен флаг переноса cf в 1. Если значение cf проигнорировать, то оставшееся в АХ значение будет правильным.

 

Пример 2: найдём сумму 25+(-300). -300d=1111111011010100b

+

=

11111110111011012 =6526110 = -27510 (sf=1; cf=0)

Результат в дополнительном коде.

Инвертируем 0000000100010010

+ 0000000000000001

= 00000001000100112 = 27510

или (neg(1111111011101101b))= 0000000100010011b=275d

При сложении чисел разных знаков:

1) если в результате получаем sf=0; cf=1, то значение в приёмнике будет верным и положительным.

2) если в результате получаем sf=1; cf=0, то значение в приёмнике будет верным в дополнительном коде и отрицательным.

 

При выполнении команды сложения устанавливаются следующие флаги:

1) CF=1, если результат не помещается в приемнике, т.е. произойдет перенос.

2) PF=1; если результат имеет четное число битов с 1.

3) AF=1, если результат сложения десятичных чисел требует коррекции.

4) ZF=1, если результат =0.

5) SF= 1, если результат отрицателен.

6) OF=1, если при сложении 2-х чисел одного знака результат превышает диапазон допустимых значений в обратном коде, а сам приемник меняет знак. SF и OF имеют смысл при сложении чисел со знаком, AF – для десятичных чисел.




Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 836; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.28.97 (0.009 с.)