Главная /
Ассемблер /
Для чайников /
Введение /
Представление данных /
Что такое BCD
BCD - это Binary-Coded Decimal (двоично-десятичный код). Он же 8421-BCD.
Это форма записи рациональных чисел, когда каждый десятичный разряд числа записывается в виде его четырёхразрядного двоичного кода.
Вообще с помощью четырёхразрядного двоичного кода можно закодировать 16 чисел - это 
шестнадцатеричная система.
Двоично-десятичный код отличается от шестнадцатеричной системы тем, что он использует только первые десять комбинаций. Значения BCD приведены в таблице ниже.
  
    | Десятичное | 
    HEX | 
    BIN | 
    BCD | 
  
  
    | 0 | 
    0 | 
    0000 | 
    0000 | 
  
  
    | 1 | 
    1 | 
    0001 | 
    0001 | 
  
  
    | 2 | 
    2 | 
    0010 | 
    0010 | 
  
  
    | 3 | 
    3 | 
    0011 | 
    0011 | 
  
  
    | 4 | 
    4 | 
    0100 | 
    0100 | 
  
  
    | 5 | 
    5 | 
    0101 | 
    0101 | 
  
  
    | 6 | 
    6 | 
    0110 | 
    0110 | 
  
  
    | 7 | 
    7 | 
    0111 | 
    0111 | 
  
  
    | 8 | 
    8 | 
    1000 | 
    1000 | 
  
  
    | 9 | 
    9 | 
    1001 | 
    1001 | 
  
  
    | 10 | 
    A | 
    1010 | 
    Запрещено | 
  
  
    | 11 | 
    B | 
    1011 | 
    Запрещено | 
  
  
    | 12 | 
    C | 
    1100 | 
    Запрещено | 
  
  
    | 13 | 
    D | 
    1101 | 
    Запрещено | 
  
  
    | 14 | 
    E | 
    1110 | 
    Запрещено | 
  
  
    | 15 | 
    F | 
    1111 | 
    Запрещено | 
  
В BCD используются только первые 10 комбинаций, которыми можно закодировать 10 цифр от 0 до 9. Остальные комбинации в BCD являются запрещёнными.
BCD код также применяется в телефонной связи. В этом случае кроме десятичных цифр кодируются символы * или #, или любые другие. Для записи этих символов в коде BCD используются запрещенные комбинации:
  
    | BCD | 
    Дополнительный символ | 
  
  
    | 1010 | 
    * (звёздочка) | 
  
  
    | 1011 | 
    # (решётка) | 
  
  
    | 1100 | 
    (плюс) | 
  
  
    | 1101 | 
    - (минус) | 
  
  
    | 1110 | 
    , (десятичная запятая) | 
  
  
    | 1111 | 
    символ гашения | 
  
Преимущества и недостатки формата BCD
Преимущества
  - Удобно использовать для вывода на индикаторы с одной цифрой. Например, в часах каждый индикатор отображает десятичное число в двоично-десятичной системе (от 0 до 9).
 
  - Упрощён вывод чисел на индикацию - вместо последовательного деления на 10 требуется просто вывести на индикацию каждый полубайт. По этой же причине проще ввод данных с цифровой клавиатуры.
 
  - Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в человекочитаемый десятичный формат и наоборот не теряется точность.
 
  - Упрощены умножение и деление на 10, а также округление.
 
По этим причинам двоично-десятичный формат применяется в калькуляторах и других устройствах, которые выводят данные на семисегментные или другие индикаторы, где каждый отдельный индикатор отображает только одну цифру. 
Недостатки
  - Требует больше памяти.
 
  - Усложнены арифметические операции.
 
Операции с BCD
Так как в BCD данных используются только 10 возможных комбинаций 4-х битового поля вместо 16, существуют запрещённые комбинации битов (см. выше). Поэтому, при сложении и вычитании чисел BCD действуют следующие правила:
  - При сложении двоично-десятичных чисел каждый раз, когда происходит перенос бита в старший полубайт, необходимо к полубайту, от которого произошёл перенос, добавить поправочное значение 0110 = 610 = (1610 - 1010) - разница количеств комбинаций полубайта и используемых значений, то есть всего комбинаций в тетраде 16, из них разрешённых 10, а запрещенных 6.
 
  - При сложении двоично-десятичных чисел каждый раз, когда встречается недопустимая для полубайта комбинация (число, большее 9), необходимо к каждой недопустимой комбинации добавить поправочное значение 0110 с разрешением переноса в старшие полубайты.
 
  - При вычитании двоично-десятичных чисел, для каждого полубайта, получившего заём из старшего полубайта, необходимо провести поправку, отняв значение 0110.
 
Поэтому почти в любом языке ассемблера есть специальные команды для работы с BCD числами.
Пример операции сложения двоично-десятичных чисел:
Требуется: Найти число Х = Y + Z, где Y = 0929, Z = 1538
Решение: Представим числа Y и Z в двоично-десятичной форме:
Y =  929 (DEC) = 0000 1001 0010 1001 (BCD)
Z = 1538 (DEC) = 0001 0101 0011 1000 (BCD)
Суммируем числа Y и Z по правилам двоичной арифметики:
        **       * 
  0000 1001 0010 1001	(929)
+ 0001 0101 0011 1000	(1538)
  ___________________
= 0001 1110 0110 0001 - Двоичная сумма (7777)
+      0110      0110 - Поправка (по правилу 1 и правилу 2)
  ___________________
  0010 0100 0110 0111 - сумма BDC (2467)
 
Красным жирным в сумме выделены запрещённые комбинации.
Синим жирным выделены поправки по правилу 2.
Чёрным жирным выделены поправки по правилу 1.
* — тетрада, из которой был перенос в старшую тетраду
** — тетрада с запрещённой комбинацией битов (в сумме)
В тетраду, помеченную символом *, добавляем шестёрку, так как по правилам двоичной арифметики перенос унёс с собой 16, а по правилам десятичной арифметики должен был унести 10. 
В тетраду, помеченную символом **, добавляем шестёрку и разрешаем распространение переноса, так как комбинация битов 1110 в сумме после  сложения соответствует десятичному числу 14 и является запрещённой.
ПРИМЕЧАНИЕ
По сути BCD - это та же шестнадцатеричная система, только с числами от 0 до 9 (числа A...F являются запрещёнными). То есть каждая тетрада записывается в числе BCD в отдельном разряде.