Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Сложение двоичных чисел без знакаСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Если при сложении результат превышает размерность поля операнда, то результат оказывается неверным. Например: 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.
Имеющиеся варианты приёмника и источник:
Сложим, например, два 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 с.) |