2010-03-01 2 views
11

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

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

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

Спасибо!

ответ

4

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

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

11

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

Есть хороший Wikipedia article, который обсуждает про и минусы.

+1

"лучшие альтернативы"? Я бы построил тип C++ 'BigDecimal' на BCD оборудования - он был бы уверен, если бы вы сделали это именно так. Я не уверен, что было бы «лучше», чем использование аппаратного типа данных. –

+2

Я сомневаюсь, что современные процессоры x86 оптимизировали реализацию BCD - они, вероятно, реализованы в виде микрокода с акцентом на совместимость, а не на производительность. – Michael

+0

IBM имеет аппаратную поддержку DECFLOAT в своих процессорах POWER 6. –

5

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

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

+0

Точные арифметические вычисления на произвольных размерах также могут быть легко выполнены на нормальных двоичных числах с нормальными двоичными числами. – Nubok

+1

@nubok: С BCD можно считывать в формате десятичного формата в произвольном размере, выполнять вычисления на нем и записывать его в десятичном формате, все в постоянное время на цифру. Если формат номера произвольного размера хранит вещи с использованием базы данных «сила-два», время с цифрой, необходимое для преобразования в/из десятичного формата, будет увеличиваться по мере увеличения N. – supercat

+0

@nubok: это правда, пока вы не работаете с целыми числами. Но если вы переходите на реальные числа, двоичное представление сосет, это то, что вы называете Float. – karatedog

4

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

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

+0

@ Майкл: Я не помню инструкции x86 для BCD. Вы можете напомнить мне, пожалуйста? –

+0

@John, я могу думать о DAA, DAS (Decimal Adjust [after] Сложение/вычитание). Там может быть несколько других, я не играл с этим ;-) – mjv

+0

@mjv: Спасибо. Я совсем забыл об этом. Я почти не помню, даже увидев пример использования этих - и это был не настоящий пример. –

6

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

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

+0

Это лучший ответ. Отображение номера не-BCD на 7-сегментном или аналогичном дисплее - логический кошмар. –

1

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

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

+0

Некоторые форматы с плавающей запятой для 6502 были основаны на десятичной основе. Программное обеспечение KIMath для MOS-технологий (опубликовано в печатной форме) использовало распакованную десятичную мантиссу с бинарным показателем для вычисления и упакованную десятичную для хранения. – supercat

+0

Я использовал BCD для интеграции ПК и мэйнфреймов в то время. – olivecoder

1

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

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

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

2

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

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

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

+0

В x87 также есть ['FBLD' и' FLSTP'] (https://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-fbld.html) для загрузки и хранения BCD номера. В некоторых современных архитектурах есть аппаратная поддержка десятичного плавания, такого как Power6 и IBM z10 –

0

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

+0

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

+0

Я вижу, это больше похоже на вопрос про прошивку. Вы не можете сидеть перед машиной и ждать более 3 секунд для ответа. В конце концов, это ответ, который конечный пользователь получает, что действительно имеет значение. – user3237507

0

Современные вычисления подчеркивали кодирование, которое фиксирует логику проектирования, а не оптимизирует несколько циклов процессора здесь или там. Значимость времени и/или памяти, сохраненной часто, не стоит писать специальные процедуры на уровне бит.

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

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