В настоящее время принято хранить числа в двоичном формате и преобразовывать их в десятичный формат для отображения, но преобразование занимает некоторое время. Если основное назначение числа должно отображаться или добавляться к числу, которое будет отображаться, может оказаться более практичным выполнять вычисления в десятичном формате, чем выполнять вычисления в двоичном формате и преобразовывать в десятичное число. Многие устройства с цифровым считыванием и многие видеоигры хранят числа в упакованном формате 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.