Ассемблер: почему существует BCD? - PullRequest
12 голосов
/ 02 марта 2010

Я знаю, что BCD похож на более интуитивный тип данных, если вы не знаете двоичный файл. Но я не знаю, зачем использовать эту кодировку, так как она не имеет большого смысла, так как ее трата представление в 4 битах (когда представление больше 9).

Кроме того, я думаю, что x86 поддерживает только добавления и подпрограммы напрямую (вы можете конвертировать их через FPU).

Возможно, это происходит от старых машин или других архитектур?

Спасибо!

Ответы [ 10 ]

11 голосов
/ 02 марта 2010

Арифметика BCD полезна для точных десятичных вычислений, что часто является требованием для финансовых приложений, бухгалтерского учета и т. Д. Она также упрощает умножение / деление на степени 10. В наши дни есть лучшие альтернативы.

Есть хорошая статья в Википедии , в которой обсуждаются плюсы и минусы.

9 голосов
/ 02 марта 2010

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

Может показаться неправдоподобным, что современный процессор x86 будет использоваться в устройстве с дисплеями такого типа, но x86 использует long , и ISA поддерживает большую обратную совместимость.

6 голосов
/ 02 марта 2010

BCD является пространственно-расточительным, это правда, но оно имеет преимущество в виде «фиксированного шага» в формате , что позволяет легко найти n-ую цифру в определенном числе.

Другое преимущество заключается в том, что он позволяет проводить точные арифметические вычисления для произвольных чисел . Кроме того, используя упомянутые характеристики «фиксированного шага», такие арифметические операции могут быть легко разделены на несколько потоков ( параллельная обработка ).

5 голосов
/ 16 июля 2011

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

Один из авторов ошибся по поводу того, что числа часто хранятся в ASCII, на самом деле большая часть хранения двоичных чисел выполняется потому, что это более эффективно. А преобразование ASCII в двоичный файл немного сложнее. BCD - это своего рода переход от ASCII к двоичному, если бы существовали инструкции bsdtoint и inttobcd, это действительно сделало бы преобразования как таковые. Все значения ASCII должны быть преобразованы в двоичные значения для арифметики. Таким образом, BCD действительно полезен в этом преобразовании ASCII в двоичное.

5 голосов
/ 02 марта 2010

BCD существует в современных процессорах x86, поскольку он был в исходном процессоре 8086, и все процессоры x86 совместимы с 8086. Операции BCD в x86 использовались для поддержки бизнес-приложений еще тогда. Поддержка BCD в самом процессоре больше не используется.

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

3 голосов
/ 31 июля 2012

В настоящее время принято хранить числа в двоичном формате и преобразовывать их в десятичный формат для отображения, но преобразование занимает некоторое время. Если основное назначение числа должно отображаться или добавляться к числу, которое будет отображаться, может оказаться более практичным выполнять вычисления в десятичном формате, чем выполнять вычисления в двоичном формате и преобразовывать в десятичное число. Многие устройства с цифровым считыванием и многие видеоигры хранят числа в упакованном формате BCD, который хранит две цифры на байт. Вот почему многие счетчики очков переполняются на 1 000 000 баллов, а не на какую-то степень двойки. Если бы аппаратное обеспечение не облегчало арифметику упакованных BCD, альтернативой было бы не использование двоичного кода, а использование неупакованного десятичного числа. Преобразование упакованного BCD в неупакованный десятичный код в момент его отображения можно легко выполнить за раз. В отличие от этого, преобразование двоичного числа в десятичное значительно медленнее и требует обработки всего количества.

Между прочим, это единственный набор инструкций 8086, который я видел с инструкциями для «ASCII Adjust для деления» и «ASCII Adjust для умножения», один из которых умножает байт на десять, а другой делит на десять , Любопытно, что значение «0A» является частью машинных инструкций, и замена другого числа приведет к тому, что эти инструкции умножатся или поделятся на другие величины, но инструкции не документированы как универсальные инструкции умножения / деления на константу. , Интересно, почему эта функция не была задокументирована, учитывая, что она могла бы быть полезной?

Также интересно отметить разнообразие подходов процессоров, используемых для добавления или вычитания упакованных BCD. Многие выполняют двоичное сложение, но используют флаг для отслеживания того, произошел ли перенос с бита 3 на 4 во время сложения; затем они могут ожидать, что код очистит результат (например, PIC), предоставят код операции для очистки сложения, но не вычитания, предоставят один код операции для очистки сложения и другой для вычитания (например, x86), или используют флаг, чтобы отслеживать, является ли последний операция была сложение или вычитание и использовать один и тот же код операции для очистки обоих (например, Z80). Некоторые используют отдельные коды операций для арифметики BCD (например, 68000), а некоторые используют флаг, чтобы указать, должны ли операции сложения / вычитания использовать двоичный код или BCD (например, 6502 производных). Интересно, что оригинальный 6502 выполняет математику BCD с той же скоростью, что и двоичная математика, но его производные от CMOS требуют дополнительного цикла для операций BCD.

2 голосов
/ 02 марта 2010

Я уверен, что статья Wiki, на которую ссылаются ранее, более детально описана, но я использовал BCD при программировании мэйнфреймов IBM (в PL / I). BCD не только гарантировал, что вы можете просматривать отдельные области байта, чтобы найти отдельную цифру - что иногда полезно - но также позволял аппаратным средствам применять простые правила для расчета требуемой точности и масштаба, например сложение или умножение двух чисел вместе.

Насколько я помню, мне сказали, что на мэйнфреймах поддержка BCD была реализована аппаратно и в то время была нашей единственной возможностью для представления чисел с плавающей запятой. (Мы говорим 18 лет иди сюда!)

1 голос
/ 02 марта 2010

Когда я учился в колледже более 30 лет назад, мне сказали, почему BCD (COMP-3 в COBOL) был хорошим форматом.

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

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

0 голосов
/ 19 августа 2014

В современных вычислениях особое внимание уделяется кодированию, которое отражает логику проектирования, а не оптимизирует несколько циклов ЦП здесь или там. Ценность сэкономленного времени и / или памяти часто не стоит писать специальные подпрограммы на уровне битов.

При этом BCD все еще иногда полезен.

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

0 голосов
/ 01 марта 2014

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

...