Jump to content

Коды операций Intel BCD

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

Кроме того, часть x87 поддерживает уникальный 18-значный (десятибайтовый) формат BCD, который можно загружать и сохранять из регистров с плавающей запятой , откуда можно выполнять обычные вычисления FP. [1]

Целочисленные инструкции BCD больше не поддерживаются в длинном режиме .

Использование

[ редактировать ]

Представление числа

[ редактировать ]

Числа BCD могут быть представлены в целочисленных регистрах двумя способами: упакованным десятичным и неупакованным десятичным числом.

  • Упакованный (4 бита)
  • Распакованный (8 бит)
    • В распакованном десятичном представлении десятичная цифра хранится в одном байте .
    • Значения от 10 до 255 не используются.
    • Верхний полубайт игнорируется и может быть либо нулевым, либо ведущим полубайтом для символа ASCII (значение 3). [2]

Обычно предполагается, что числа 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]

Сопроцессор 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]

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б «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]
  2. ^ Перейти обратно: а б с д и ж г час я дж к л Хайд, Рэндалл (сентябрь 2003 г.). Десятичная арифметика . Пресс без крахмала . Архивировано из оригинала 2 ноября 2008 г. Проверено 18 октября 2008 г. {{cite book}}: |work= игнорируется ( помогите )
  3. ^ Перейти обратно: а б с д и ж Том 2A: Справочник по набору команд, AM (PDF) . Том. 2А. Корпорация Интел . 17 мая 2007 г. Архивировано из оригинала (PDF) 15 марта 2008 г. Проверено 27 июня 2007 г. {{cite book}}: |work= игнорируется ( помогите )
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 20a16f2a00eb2d5c9b20ec4db243b1bc__1705294380
URL1:https://arc.ask3.ru/arc/aa/20/bc/20a16f2a00eb2d5c9b20ec4db243b1bc.html
Заголовок, (Title) документа по адресу, URL1:
Intel BCD opcodes - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)