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



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

Флаг переноса cf, установка которого в 1 говорит о том, что произошёл выход за пределы разрядности операндов. Регистрация состояния старшего (знакового) разряда операнда осуществляется с помощью флага переполнения of в регистре eflags (бит 11).

Пример1.

30566=0111011101100110

+

00687=0000001010101111

=

31253=0111101000010101 – результат правильный.

Пример2.

30566=0111011101100110

+

30566=0111011101100110

=

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

Пример3.

-30566=1000100010011010

+

-04875=1110110011110101

=

-35441=0111010110001111 – результат неправильный, так как получилось положительное число (в старшем бите 0)

Пример4.

-4875=1110110011110101

+

-4875=1110110011110101

=

-9750=1101100111101010 – результат правильный.

 


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

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

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

 

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

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

Таблица 1.


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

+

=

11111111111110102 =6553010 =fffa16

Тогда:

Mov ax,FFFAh

Mov dx, 7h

Add ax,dx

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

 

Пример: вычтем 25-300

-

=

11111110111011012 =6526110 = -27510

Если произошёл заём 1 из старшего разряда, то состояние флага cf установлено в 1 – значит результат получился в дополнительном коде.

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

+ 0000000000000001

= 00000001000100112 = 27510


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

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

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

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

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

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

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


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

Команды вычитания выполняют вычитание, по рассмотренным алгоритмам, а учёт особых ситуаций должен производиться самим разработчиком программного продукта.

К командам вычитания относят:

– DEC <операнд> – операция декремента. Флаг CF не затрагивается, а остальные арифметические флаги (OF, SF, ZF, AF, PF) устанавливаются в соответствии с результатом вычитания.

– SUB <операнд_1>,<операнд_2> – команда вычитания;

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

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

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

– SBB <операнд_1>,<операнд_2> – команда вычитания с учётом заёма (флага cf).

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

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

 

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

Sub eax,ecx

Sbb edx,ebx

Если при вычитании младших двойных слов произошел заем, то он будет учтен при вычитании старших.

Пример: в регистр al поместить результат вычитания 5-10.

0000 0101 - 0000 1010 ----------------- 1111 1011=FFFBh 0-1111 1011=0000 0101(neg)

Факт того, что в al записано отрицательное число, отражён в состоянии флага cf.

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

Вычитание в микропроцессоре производится путём сложения. Результат вычитания нужно рассматривать как значение в дополнительном коде. Например:

-45-45=-90

-45=11010011

+

-45=11010011

=

-90=10100110 число в дополнительном коде.

+00000001

=010110102 =9010

 


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

Для умножения чисел без знака предназначена команда:

MUL <источник>;

Выполняет умножение содержимого источника (регистр или переменная) и регистра AL, АХ, ЕАХ (в зависимости от размера источника) и помещает результат в АХ, DX:AX, EDX:EAX соответственно. Произведение имеет двойной размер.

 

Размер Источник Результат

 

Если АН, DX, EDX содержит только нули, то флаги CF=0 и OF=0, иначе — в 1.

Например, умножим содержимое регистра al (25) на 45.



Поделиться:


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

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