Инструменты пользователя

Инструменты сайта


examination:asm:question36

Вопрос №36. Вычитание двоично-десятичных неупакованных чисел

Суть двоично-десятичных двоичных чисел заключается в том, что на запись каждой цифры отводится 4 младших бита, а 4 старших бита отводятся под запись ANSII кода. Например, десятичное число 31110 будет записано в двоичной системе счисления в двоичном коде как 111100110000110, а в двоично-десятичном коде как 00000011 00000001 00000001 00000001 00000000, то есть на каждое число отводится по 4 младших бита, либо в формате ANSII 00110011 00110001 00110001 00110001 00110000 значения величин в формате слова и двойного слова имеют ограниченный диапазон. Если программа предназначена для работы в области финансов, то ограничение суммы в рублях величиной 65 536 (для слова) или даже 4 294 967 296 (для двойного слова) будет существенно сужать сферу ее применения, данную проблему решают подобные числа, они не ограничивают размер данных, хотя и приходится тратить больше памяти на хранение чисел

Преимущества

• Упрощён вывод чисел на индикацию — вместо последовательного деления на 10 требуется просто вывести на индикацию каждый полубайт. Аналогично, проще ввод данных с цифровой клавиатуры.

• Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в человекочитаемый десятичный формат и наоборот не теряется точность.

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

Недостатки

• Усложнены арифметические операции.

• Требует больше памяти.

• В двоично-десятичном коде 8421-BCD существуют запрещённые комбинации битов: Запрещённые в 8421-BCD битовые комбинации

1010 1011 1100

1101 1110 1111

и иначе)

Десятичные числа

Десятичные числа — специальный вид представления числовой информации, в ос- нову которого положен принцип кодирования каждой десятичной цифры числа группой из четырех битов. При этом каждый байт числа содержит одну или две десятичные цифры в так называемом двоично-десятичном коде (Binary-Coded Decimal, BCD). Процессор хранит BCD-числа в двух форматах:

В упакованном формате каждый байт содержит две десятичные цифры. Деся- тичная цифра представляет собой двоичное значение в диапазоне от 0 до 9 раз- мером четыре бита. При этом код старшей цифры числа занимает старшие четыре бита. Следовательно, диапазон представления десятичного упакован- ного числа в одном байте составляет от 00 до 99.

В неупакованном формате каждый байт содержит одну десятичную цифру в че- тырех младших битах. Старшие четыре бита имеют нулевое значение. Это так называемая зона. Следовательно, диапазон представления десятичного неупа- кованного числа в одном байте составляет от 0 до 9.

Вычитание

Ситуация при вычитании вполне аналогична сложению. Рассмотрим те же случаи. Результат вычитания не больше 9:

6 = 00000110

3 = 00000011

3 = 00000011.

Как видим, заема из старшей тетрады нет. Результат верный и корректировки не требует.

Результат вычитания больше 9:

6 =00000110

7 =00000111

-1-11111111.

Вычитание проводится по правилам двоичной арифметики. Поэтому результат не является BCD-числом. Правильный результат в неупакованном BCD-формате должен быть 9 (0000 1001 в двоичной системе счисления). При этом предполагается заем из старшего разряда, как при обычной команде вычитания, то есть в случае с BCD-числами фактически должно быть выполнено вычитание 16 - 7. Таким образом, как и в случае сложения, результат вычитания нужно корректировать. Для этого существует специальная команда AAS (ASCII Adjust for Substraction), выполняющая коррекцию результата вычитания для представления в сим- вольном виде.

Команда AAS также не имеет операндов и работает с регистром AL, анализируя его младшую тетраду следующим образом: если ее значение меньше 9, то флаг CF сбрасывается в 0 и управление передается следующей команде. Если значение тетрады в AL больше 9, то команда AAS выполняет следующие действия.

1. Из содержимого младшей тетрады регистра AL (заметьте, не из содержимого всего регистра) вычитается

2. Старшая тетрада регистра AL обнуляется.

3. Флаг CF устанавливается в 1, тем самым фиксируется воображаемый заем из старшего разряда.

Понятно, что команда AAS применяется вместе с основными командами вычи- тания SUB и SBB. При этом команду SUB есть смысл использовать только один раз при вычитании самых младших цифр операндов, далее должна применяться ко- манда SB В, которая будет учитывать возможный заем из старшего разряда.

examination/asm/question36.txt · Последние изменения: 2014/01/15 08:12 (внешнее изменение)