Подтвердить что ты не робот

Ассемблер: почему существует BCD?

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

При этом BCD по-прежнему полезно.

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