Коды операций Intel BCD
Коды операций Intel BCD представляют собой набор из шести x86 инструкций , которые работают с в двоичном коде десятичными числами . Система счисления, используемая для представления чисел в x86 процессорах , равна 2. Это называется двоичной системой счисления . Однако процессоры x86 имеют ограниченную поддержку десятичной системы счисления .
Кроме того, часть x87 поддерживает уникальный 18-значный (десятибайтовый) формат BCD, который можно загружать и сохранять из регистров с плавающей запятой , откуда можно выполнять обычные вычисления FP. [1]
Целочисленные инструкции BCD больше не поддерживаются в длинном режиме .
Использование
[ редактировать ]Представление числа
[ редактировать ]Числа BCD могут быть представлены в целочисленных регистрах двумя способами: упакованным десятичным и неупакованным десятичным числом.
- Упакованный (4 бита)
- В упакованном десятичном представлении десятичная цифра хранится в одном полубайте .
- Значения от 10 до 15 не используются. [2]
- Распакованный (8 бит)
Обычно предполагается, что числа BCD хранятся в самом младшем байте регистра, например AL; операции с неупакованными числами BCD ожидают младшую цифру в младшем байте регистра, например AL, и старшую цифру во втором младшем байте, например AH.
Добавление
[ редактировать ]можно только десятичные числа от 0 до 99 Непосредственно складывать .
Сначала числа складываются как обычно с помощью add (или adc , если вам нужен флаг переноса ). Процессор установит флаг корректировки, если сумма обоих младших полубайтов равна 16 или выше, и флаг переноса, если сумма обоих байтов равна 256 или выше.
Затем результат корректируется в зависимости от представления числа.
- упакованный
- Результат корректируется с помощью daa (десятичная корректировка после сложения): если младший значащий полубайт результата равен 10 или выше или если установлен флаг корректировки, то процессор добавляет 6 к результату и отбрасывает любое переполнение полубайта.
- Затем, если самый старший полубайт результата равен 10 или выше или если установлен флаг переноса, то процессор добавляет к результату 96 (6 раз 16) и устанавливает флаг переноса. [2] [3]
- Распаковано
- Результат корректируется с помощью aaa (корректировка ASCII после сложения): если младший значащий полубайт результата равен 10 или выше, то процессор добавляет к нему 6, отбрасывает любое переполнение полубайта и сохраняет его в наименее значимом байте.
- Старший байт увеличивается.
- Обратите внимание, что на этом этапе старший байт может не содержать допустимого десятичного числа. [2] [3]
Вычитание
[ редактировать ]можно только десятичные числа от 0 до 99 Непосредственно вычитать . Сначала числа вычитаются , как обычно, с помощью sub (или sbb , если вам нужен флаг переноса). Процессор установит флаг корректировки, если заимствование произошло в наименее значимом полубайте, и флаг переноса, если заимствование произошло в наиболее значимом полубайте.
- упакованный
- Результат корректируется с помощью das (десятичная корректировка после вычитания): если младший полубайт результата равен 10 или выше или если установлен флаг корректировки, то процессор вычитает 6 из результата.
- Затем, если самый старший полубайт результата равен 10 или выше, или если установлен флаг переноса, то процессор вычитает 96 (6 раз 16) из результата и устанавливает флаг переноса. [2] [3]
- Распаковано
- Результат корректируется с помощью aas (корректировка ASCII после вычитания): если младший полубайт результата равен 10 или выше, то процессор вычитает из него 6 и сохраняет его в наименее значимом байте.
- Старший байт уменьшается.
- Обратите внимание, что на этом этапе старший байт может не содержать допустимого десятичного числа. [2] [3]
Умножение
[ редактировать ]Поддерживается только распакованное представление. можно только два однозначных числа Умножать .
Сначала цифры умножаются, как обычно, с помощью mul .
Затем результат корректируется с помощью aam (корректировка ASCII для умножения): процессор делит результат на десять, сохраняя частное (только целую часть) в наиболее значимом байте результата, а остаток в наименее значимом байте результата. . [2] [3]
Разделение
[ редактировать ]Поддерживается только распакованное представление. Операнды должны находиться в диапазоне от 0 до 99.
Сначала операнды преобразуются в обычное двоичное представление с помощью aad (корректировка ASCII перед делением): процессор преобразует числа путем умножения старшего байта на 10 и добавления младшего байта. Частное и остаток от деления получаются, как обычно, с помощью div и будут представлены в обычном двоичном представлении. [2] [3]
В х87
[ редактировать ]Сопроцессор x87 имеет поддержку BCD в форме пары инструкций загрузки (FBLD) и сохранения и извлечения (FBSTP). Первый загружает 80-битное целое число BCD в FPU, а второй записывает значение FPU как 80-битное целое число в память. Внутри FPU значения хранятся как обычные числа с плавающей запятой повышенной точности x87 . В отличие от версий с целочисленным форматированием, эти две инструкции остаются доступными в длинном режиме. [1]
80-битный формат делится на следующие:
79 | 78 .. 72 | 71 .. 0 |
---|---|---|
Знак | Неиспользованный (0) | 18 упакованных цифр |
Существует специальное «неопределенное» значение, закодированное как FFFFC000000000000000h.
Приложение
[ редактировать ]Двоично-десятичные числа (BCD) используются для хранения десятичных чисел, особенно в финансовом программном обеспечении. [2]
Упомянутые выше коды операций обеспечивают элементарную поддержку BCD для x86. [2]
Альтернативы
[ редактировать ]Сложение чисел BCD с использованием этих кодов операций — сложная задача, требующая множества инструкций для сложения даже скромных чисел. Также может потребоваться большой объем памяти. [2] Если выполняются только целочисленные вычисления, то все целочисленные вычисления являются точными, поэтому основание представления числа не имеет значения для точности. На процессоре x86 вычисления с двоичными числами обычно выполняются намного быстрее, чем те же вычисления с числами BCD. [2]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перейти обратно: а б «4.7 BCD и упакованные целые числа BCD». Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 1: Базовая архитектура (PDF) . Версия 072. Том. 1. Корпорация Интел . 27 мая 2020 г. [1997]. стр. 3–2, 4–9–4–11 [4–10]. 253665-072США. Архивировано (PDF) из оригинала 6 августа 2020 г. Проверено 6 августа 2020 г.
[…] При работе с целыми числами 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 к 10 18 − 1. Десятичный формат целых чисел существует только в памяти. Когда десятичное целое число загружается в регистр данных x87 FPU, оно автоматически преобразуется в формат с плавающей запятой двойной расширенной точности . Все десятичные целые числа точно представимы в формате двойной повышенной точности. […]
[1] - ^ Перейти обратно: а б с д и ж г час я дж к л Хайд, Рэндалл (сентябрь 2003 г.). Десятичная арифметика . Пресс без крахмала . Архивировано из оригинала 2 ноября 2008 г. Проверено 18 октября 2008 г.
{{cite book}}
:|work=
игнорируется ( помогите ) - ^ Перейти обратно: а б с д и ж Том 2A: Справочник по набору команд, AM (PDF) . Том. 2А. Корпорация Интел . 17 мая 2007 г. Архивировано из оригинала (PDF) 15 марта 2008 г. Проверено 27 июня 2007 г.
{{cite book}}
:|work=
игнорируется ( помогите )