Код операции Intel BCD - Intel BCD opcode
В Intel Коды операций BCD набор из шести x86 инструкции которые работают с двоично-десятичный код числа. В основание используется для представления чисел в x86 процессоры равно 2. Это называется двоичная система счисления. Однако процессоры x86 имеют ограниченную поддержку десятичная система счисления.
В дополнение x87 часть поддерживает уникальный 18-значный (10-байтовый) формат BCD, который может быть загружен и сохранен из плавающая точка регистры, из которых могут выполняться обычные вычисления FP.[1]
Инструкции целочисленного BCD больше не поддерживаются в длинный режим.
использование
Представление числа
BCD-числа могут быть представлены в целочисленных регистрах двумя способами: упакованным десятичным и неупакованным десятичным.
- Упаковано (4 бита)
- В упакованном десятичном представлении a десятичная цифра хранится в одном клев.
- Значения от 10 до 15 не используются.[2]
- Без упаковки (8 бит)
Обычно предполагается, что значения хранятся в младших 8 битах регистра, например AL.
Добавление
Можно использовать только десятичные числа от 0 до 99. добавлен напрямую.
Сначала числа складываются как обычно с помощью Добавить (или же adc если вам нужен нести флаг ). Процессор установит флаг настройки, если сумма обоих младших полубайтов равна 16 или больше, и флаг переноса, если сумма обоих байтов равна 256 или больше.
Затем результат корректируется в зависимости от представления числа.
- Упакованы
- Результат корректируется с помощью даа (десятичная корректировка после добавления): если наименее значимый полубайт результата равен 10 или больше, или если установлен флаг настройки, то процессор добавляет 6 к результату и отбрасывает любое переполнение полубайта.
- Затем, если наиболее значимый полубайт результата равен 10 или больше, или если установлен флаг переноса, то процессор добавляет 96 (6 раз по 16) к результату и устанавливает флаг переноса.[2][3]
- Без упаковки
- Результат корректируется с помощью ааа (Настройка ASCII после добавления): Если наименее значимый полубайт результата равен 10 или больше, то процессор добавляет к нему 6 и отбрасывает любое переполнение полубайта и сохраняет его в младшем значащем байте.
- Увеличивается старший байт.
- Обратите внимание, что на этом этапе старший байт может не содержать допустимого десятичного числа.[2][3]
Вычитание
Можно использовать только десятичные числа от 0 до 99. вычтенный напрямую. вычтенный как обычно, используя суб (или же sbb если вам нужен флаг переноса). Процессор установит флаг настройки, если заимствование произошло в младшем полубайте, и флаг переноса, если заимствование произошло в самом старшем полубайте.
- Упакованы
- Результат корректируется с помощью das (десятичная корректировка после вычитания): если младший полубайт результата равен 10 или больше, или если установлен флаг регулировки, то процессор вычитает 6 из результата.
- Затем, если наиболее значимый полубайт результата равен 10 или больше, или если установлен флаг переноса, то процессор вычитает 96 (6 раз по 16) из результата и устанавливает флаг переноса.[2][3]
- Без упаковки
- Результат корректируется с помощью аас (Настройка ASCII после вычитания): если младший байт результата равен 10 или больше, то процессор вычитает из него 6 и сохраняет его в младшем значащем байте.
- Уменьшается старший байт.
- Обратите внимание, что на этом этапе старший байт может не содержать допустимого десятичного числа.[2][3]
Умножение
Поддерживается только распакованное представление. Можно использовать только два однозначных числа. умноженный.
Сначала цифры умножаются как обычно с помощью мул.
Затем результат корректируется с помощью ААМ (ASCII с поправкой на умножение): процессор делит результат на десять, сохраняя частное (только интеграл часть) в старшем байте результата и остаток в младшем байте результата.[2][3]
Разделение
Поддерживается только распакованное представление. Операнды должны находиться в диапазоне от 0 до 99.
Сначала операнды преобразуются в нормальное двоичное представление с использованием аад (Настройка ASCII перед делением): процессор преобразует числа, умножая старший байт на 10 и добавляя младший байт. Частное и остаток от разделение получаются как обычно с использованием div, и будет представлен в обычном двоичном представлении.[2][3]
В x87
В x87 сопроцессор имеет поддержку BCD в виде пары инструкций загрузки (FBLD) и сохранения и загрузки (FBSTP). Первый загружает 80-битное целое число BCD в FPU, а последний записывает значение FPU как 80-битное целое число в память. Внутри FPU значения хранятся как обычно. x87 поплавки повышенной точности. В отличие от целочисленных версий, две инструкции остаются доступными в долгом режиме.[1]
80-битный формат делится на следующие:
79 | 78 .. 72 | 71 .. 0 |
---|---|---|
Знак | Не используется (0) | 18 упакованных цифр |
Существует специальное «неопределенное» значение, закодированное как FFFFC000000000000000h.
Заявление
Десятичное число с двоичным кодом (BCD) числа используются для хранения десятичных чисел, особенно в финансовом программном обеспечении.[2]
В коды операций Упомянутое выше дает x86 элементарную поддержку BCD.[2]
Альтернативы
Добавление чисел BCD с использованием этих кодов операций - сложная задача, требующая множества инструкций для добавления даже скромных чисел. Также может потребоваться большой объем памяти.[2] Если выполняются только целочисленные вычисления, тогда все целочисленные вычисления являются точными, поэтому основание системы счисления не имеет значения для точности. На процессоре x86 вычисления с двоичными числами обычно намного быстрее, чем те же вычисления с числами BCD.[2]
Смотрите также
Рекомендации
- ^ а б «4.7 BCD целые и упакованные BCD целые». Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 1: Базовая архитектура (PDF). Версия 072. 1. Корпорация Intel. 2020-05-27 [1997]. С. 3–2, 4-9–4-11 [4-10]. 253665-072US. В архиве (PDF) из оригинала 2020-08-06. Получено 2020-08-06.
[…] При работе на BCD целые числа в регистры общего назначения, значения BCD могут быть распакованный (одна цифра BCD на байт) или упакованный (две цифры BCD на байт). Значение распакованного целого числа BCD - это двоичное значение младшего полбайта (биты с 0 по 3). Старший полубайт (биты с 4 по 7) может иметь любое значение во время сложения и вычитания, но должен быть равен нулю во время умножения и деления. Упакованные целые числа BCD позволяют содержать две цифры BCD в одном байте. Здесь цифра в старшем полубайте более значима, чем цифра в младшем полубайте. […] При работе с целыми числами BCD в x87 FPU регистры данных, значения BCD упакованы в 80-битном формате и называются десятичными целыми числами. В этом формате первые 9 байтов содержат 18 цифр BCD, по 2 цифры на байт. В младшая цифра содержится в младшем полубайте байта 0 и самая значимая цифра содержится в верхнем полубайте байта 9. Самый старший бит байта 10 содержит знаковый бит (0 = положительный и 1 = отрицательный; биты с 0 по 6 байта 10 являются все равно биты). Отрицательные десятичные целые числа не хранятся в два дополнения форма; они отличаются от положительных десятичных целых чисел только знаковым битом. Диапазон десятичных целых чисел, которые можно закодировать в этом формате, равен −10.18 +1 к 1018 - 1. Десятичный целочисленный формат существует только в памяти. Когда десятичное целое число загружается в регистр данных x87 FPU, оно автоматически преобразуется в формат с плавающей запятой двойной расширенной точности. Все десятичные целые числа можно точно представить в формате двойной расширенной точности. […]
[1] - ^ а б c d е ж грамм час я j k л Гайд, Рэндалл (Сентябрь 2003 г.). Десятичная арифметика. Искусство программирования на языке ассемблера. Пресс без крахмала. Архивировано из оригинал на 2008-11-02. Получено 2008-10-18.
- ^ а б c d е ж Том 2A: Справочник по набору команд, A – M (PDF). Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32. 2А. Корпорация Intel. 2007-05-17. Архивировано из оригинал (PDF) на 2008-03-15. Получено 2007-06-27.