Операции двоичного сложения и вычитания с использованием дополнительного и обратного кодов



МОСКОВСКИЙ АВТОМОБИЛЬНО-ДОРОЖНЫЙ

ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

(МАДИ)

 

 

Т.М. АЛЕКСАНДРИДИ, Б.Н. МАТЮХИН, Е.Н. МАТЮХИНА

 

 

ОРГАНИЗАЦИЯ ЭВМ И СИСТЕМ

 

                        

 

Учебное пособие

 

 

Рекомендовано Учебно-методическим объединением вузов по университетскому политехническому образованию в качестве учебного пособия для направления 552800 «Информатика и вычислительная техника» и направления 654600 «Информатика и вычислительная техника» по специальности 230102 «Автоматизированные системы обработки информации и управления (АС) ».

 

 

                                          МОСКВА 2010

Введение

Настоящее учебное пособие предназначено для студентов направления 552800 «Информатика и вычислительная техника» и направления 654600 «Информатика и вычислительная техника» по специальности 230102 «Автоматизированные системы обработки информации и управления (АСОИУ)» и используется при изучении теоретических разделов дисциплин «Схемотехника» и «Организация ЭВМ и систем», выполнении лабораторных работ, а также при курсовом и дипломном проектировании.

    В 1-й главе учебного пособия рассмотрены вопросы представления данных в ЭВМ, основные коды двоичных и двоично-десятичных алгебраических чисел, методы и алгоритмы выполнения операций сложения, вычитания, умножения и деления. Описаны также способы контроля правильности выполнения операций пересылки, сдвига, сложения и вычитания на основе использования сверток по мод.2 и по мод.3.

Во 2-й главе учебного пособия рассмотрены вопросы логического и схемотехнического проектирования цифровых устройств. Представлены разделы применения алгебры логики для решения задач анализа и синтеза логических схем, системы цифровых логических элементов, интегральные триггеры, основные функциональные узлы ЭВМ. 

В 3-й главе учебного пособия рассмотрены назначение, принцип действия, структурные и функциональные схемы основных функциональных устройств, входящих в состав ЭВМ. Изложены методика и примеры проектирования основных блоков арифметическо-логического устройства и устройства управления.

   В 4-й главе учебного пособия рассмотрены назначение, принцип действия, структурные и функциональные схемы основных типов микропроцессоров (МП) и соответствующих микропроцессорных комплектов (МП-комплектов), на основе которых строятся современные универсальные и специализированные ЭВМ и системы. Изложены методика и примеры проектирования МП-систем для использования в АСОИУ.

АРИФМЕТИЧЕСКИЕ ОСНОВЫ ЭВМ

          1.1. Основные форматы чисел

    В ЭВМ выполняется обработка следующих видов данных: двоичных чисел, десятичных чисел и символьных данных.

    Для представления всех видов данных в ЭВМ используются различные форматы.

    Числа могут представляться в форме с фиксированной запятой и в форме с плавающей запятой. Для формы с фиксированной запятой форматы чисел будут различными для дробных и целых чисел.

    Если А = 3Н, а1 а2 а3 ......... аn

    аn = {0,1} - двоичные цифры

    | A | < 1, то формат (разрядная сетка) имеет следующий вид:

№ разряда 0 1 2 3 .......... n
Значение ЗНАК 2-1 2-2 2-3 .......... 2-n

 

    Положение запятой фиксируется перед разрядом с весом 2-1 .

    Формат целого числа для |A| > 1 выглядит следующим образом:

    № разряда n n-1 .......... 2 1 0
Значение ЗНАК 2n-1 .......... 22 21 20

 

Положение запятой фиксировано после разряда с весом 20.

     Числа с плавающей запятой хранятся в памяти ЭВМ в нормализованном виде: a=А∙10а, где А - мантисса, 10 - основание системы счисления, а - порядок.

    Мантисса должна удовлетворять следующему требованию:

                       1/10≤│A│< 1, для двоичной системы │А│≥ 2-1

    Разрядная сетка (формат) такого числа имеет следующий вид:

Знак порядка Порядок Знак числа Мантисса
  2m........22 21 20   2-1 2-2 ............2-n

 

    В современных ЭВМ принято, что формат данных должен быть кратным байту — восьми двоичным разрядам.

    Десятичные числа в ЭВМ изображаются с помощью двоично-десятичных кодов. Каждая десятичная цифра при этом представляется четырьмя двоичными разрядами, т.е. в одном байте помещается две десятичные цифры.

Машинные коды алгебраических чисел

    В ЭВМ используются, в основном, следующие коды чисел: прямой, обратный и дополнительный.

    Если А — число с фиксированной запятой, |A| < 1;

    [A]п  — прямой код числа, который образуется по следующему правилу:

                  А, при А ≥ 0,

    [A]п =                                                                                                                                           (1.1)

                  1 – A, при А < 0.

 

В машинных кодах знаки чисел отображаются с помощью двоичных цифр. Принято обозначать

                  ЗН. ”+” := 0.;        ЗН. ” — ” := 1.

    Пример. А= +.101101; [A]п = 0.101101

 

    А= -.101101;      [A]п = _1.000000

                                             -.101101

                                      1.101101

    Представление чисел в прямом коде используется в ЭВМ при вводе и выводе, при хранении данных в ЭВМ (не всегда). Достоинством прямого кода является простота и привычность представления чисел в виде модуля числа и знака. Однако применение прямого кода для реализации алгебраических операций не очень удобно. Рассмотрим примеры выполнения операций сложения и вычитания в прямых кодах.

    S1 = A + B ;             S2 = A - B ; A=37/64; B=19/64.

     A= +.100101;        B= +. 010011

                       111 – переносы                            1 – заем

    [A]п = 0.100101                        [A]п = 0.100101

    [B]п =     0.010011                        [B]п = 0.010011

    [S1]п = 0.111000                                [S2]п = 0.010010

    S1=56/64                                   S2=18/64

    Как следует из этих примеров, сложение и вычитание различаются правилами образования переноса и заема. Это означает, что при разработке схем арифметического блока нужно будет строить не только сумматоры, но и вычитатели, т.е. специальные схемы, реализующие операцию вычитание. Такое техническое решение приведет к увеличению аппаратуры и практически не применяется.

    Более широко для реализации алгебраических операций используются специальные коды, которые позволяют заменить операцию вычитание — сложением. При этом оказывается возможным при построении арифметических устройств использовать только сумматоры.

              Обратный код числа образуется по следующему правилу:

                                 [A]о = [A]п, при А≥0,

              [A]о =                                                                     (1.2)

                                 [A]о = 10 + A - 10-n, при А<0

    Например, А = -.101101

              [A]о = _10.000000

                              .101101

                          _1.010011

                              .000001

                                 1.010010.

    Как видно из этого примера для получения обратного кода все цифры числа инвертируются. По этому же правилу осуществляется перевод обратного кода в прямой код.

    Дополнительный код числа образуется по следующему правилу:

                 [A]п,        при А ≥ 0

       [A]д =                                                          (1.3)

10 + A, при А<0                                                  

    Пример образования дополнительного кода отрицательного числа

 

    А= -7/16 = -0.0111     [A]д = _10.0000               

.0111

                                                          1.1001

    Анализ правил образования обратного кода (1.2) и дополнительного кода (1.3) показывает, что для двоичной системы счисления является справедливым следующее соотношение:

    [A]д = [A]о + 2-n.                                                              (1.4)

    На практике для нахождения дополнительного кода используют соотношение (1.4), а не (1.3).

Операции двоичного сложения и вычитания с использованием дополнительного и обратного кодов

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

    1.3.1 Вычитание  на основе дополнительного кода

  Пусть надо найти (действия выполняются над модулями чисел):

S=A+B; |A|<1; |B|<1; A>0; B<0. Тогда S= A - |B|;

Будем вычислять сумму модулей  в виде 

S* = [A]п + [-|В|]д = A+10 -|B|=10+(A - |B|)       (1.5)

Рассмотрим два возможных случая:

1) А - |B| ≥0 , тогда S* ≥0; S*≥10

    Поскольку разрядная сетка рассчитана на размещение чисел по модулю меньших 1, то слагаемое “10” образует перенос из старшего разряда P0=1, который выходит за пределы разрядной сетки. При этом в разрядной сетке окажется сумма в прямом коде, т.е.

              [S]п = S* - 10  =  A - |B|

    Следовательно, наличие переноса из старшего разряда сумматора является признаком того, что сумма положительна и получилась в прямом коде.

2) Если в выражении (2.1) принять (А - |B|) < 0, то S* < 10, S<0 и по определению (1.3) оказывается, что S* = [A- |B|]д.  Следовательно, отсутствие переноса из старшего разряда сумматора является признаком того, что сумма получилась в дополнительном коде.

    Рассмотрим для иллюстрации несколько примеров.

    Пример 1:

    S = A+B; A= .11011; B= -.00101 [-|В|]д = .11011.

    S* = |A| + [-|В|]д = .11011

                                   .11011

                  S*=1.10110                 S*>1.

    В этом примере за пределы разрядной сетки вышла единица переноса Р0 = 1 , следовательно, результат получился положительный и в прямом коде S = [S]п = 0.10110.

Пример 2:                                                     

S=A+B; A= -.11001              [A]д = 1.00111    B= .00101

S*=[|A| ]д + [|B| ]п    .00111

                          +.00101            

                       S* =  .01100        

В этом примере перенос из старшего разряда отсутствует, т.е.  Р0 = 0, следовательно, результат отрицательный и получился в дополнительном коде, S* = [S]д.

1.3.2 Вычитание на основе обратного кода    Остановимся на особенностях выполнения операций сложения и вычитания на основе обратного кода.

Будем вычислять ( действия выполняются над модулями чисел):

    S = A+B;  |A| < 1; |B| < 1; A > 0; B < 0.

    Найдем решение в виде:

    S* = A  + [-|B|]o = A + 10 - |B| - 10-n = 10+(A - |B|) - 10-n      (1.6)

    Оценим возможные варианты решения:

      1) Если   А - |B| ≥ 0, то           S* ≥ 10                  

    Анализ выражения (1.6) показывает, что так как “10” образуется за счет переноса  из  старшего разряда Р0 = 1, то в разрядной сетке остается выражение (А - |B|) - 10-n.

    Следовательно, для получения правильного результата, если

Р0 = 1, необходимо добавить к полученной сумме единицу младшего разряда:

               |S| = (A - |B|) - 10-n +10-n = A - |B|

    Эта процедура носит название “циклический перенос”, так как при возникновении переноса из старшего разряда Р0 = 1 именно этот сигнал должен поступать на вход переноса младшего разряда сумматора для коррекции результата. При этом  результат получается положительным и в прямом коде.

2) Если  А - |B| < 0 , то  выражение (1.6)  представляет собой по определению обратный код искомой разности. При этом S* < 10 ,переноса из старшего разряда не возникает Р0 = 0, результат отрицательный S<0, S* = [|S|]o

     Пример 1 S=A+B; A= .11011              B= -.00101

S*= |A|  + [- |B| ]о   = .11011

+ .11010

                                   1.10101   так как Р0 = 1, то выполняется 

                               + .00001       циклический перенос                                  |S| = .10110 ЗНS = ЗНА   [S]п = 0.10100

     Пример 2

S=A - B; A= .00101.             B= .11001

S*= |A|  + [- |B| ]о =  .00101

                       +.00110

                 S*=.01011

    Поскольку переноса из старшего разряда нет (Р0 = 0), то результат отрицательный и получился в обратном коде. Следовательно,

    S*=[|S|]о ; [S]о = 1.01011 [S]п = 1.10100

    Рассмотрим еще один пример, в котором представляется вариант с переполнением сетки

S=A + B; A= .11011             B= .01001

S*=  |A| + |B| = .11011

                + .01001

               S*=1.00100

    На основе приведенных выше способов оценки результат должен получиться отрицательным, так как Р0 = 0, да и в знаковом разряде также стоит “1”. Однако сумма положительна, но |S*|>1 т.е. произошло переполнение разрядной сетки. Следовательно, для обнаружения такой ситуации должны быть использованы дополнительные логические условия.

Модифицированные коды

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

№ разряда 0 2 3 .......... n
Значение ЗН[0] ЗН[1] 2-1 2-2 .......... 2-(n-1)

 

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

ЗН[0] ЗН[1]    
0 0 |S|<1 S>0
1 1 |S|<1 S<0
0 1 |S|≥1 S>0
1 0 |S|≥1 S<0

 

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


Дата добавления: 2018-05-12; просмотров: 1206; Мы поможем в написании вашей работы!

Поделиться с друзьями:






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