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

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


examination:asm:question39

Вопрос №39. Операции над упакованными двоично-десятичными числами

Суть упакованных чисел состоит в том, что в одном байте можно хранить два десятичных числа, например число 12345678 может хранитьс в 4 байтах ( от неупакованных чисел отличаются упакованные тем, что здесь, в одном байте хранится два числа, то есть число 51 в неупакованном формате выглядит как 05h 01h, а у упакованном формате оно выглядит как 51h. Для неупакованного числа на каждую цифру отводится байт, чтобы можно было быстро переводить в формат ANSII, просто заменяя старшие 4 бита в числе на 0011) A dd 12345678h

Упакованный формат чисел имеет следующие преимущества:

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

• Конвертировать упакованное десятичное число в формат ANSI достаточно просто Для конвертирования результата сложения и вычитания в формат упакованного числа, для сложения ( ADD, ADC) это DAA, для вычитания (SUB,SBB) это DAS

Команды DAA и DAS конвертируют число, находящееся в регистре AL.

Например для команды DAA Mov al, 35h

Add al,48h ;al= 7Dh

Daa ;al= 83h - десятичный результат

Например для команды DAS Mov bl,48h

Mov al,85h

Sub al,bl ;al=3Dh

Das ;al=37h

Команд, осуществляющих корректировку результата деления\ умножения – нет, для этого нужно числа прежде распаковать, умножить\поделить, а потом заново запаковать.

и иначе)

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

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

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

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

Упакованные BCD-числа

Как уже отмечалось ранее, упакованные BCD-числа можно только складывать и вы- читать. Для выполнения других действий над ними их нужно дополнительно преобразовывать либо в неупакованный формат, либо в двоичное представление. Таким образом, сами по себе упакованные BCD-числа представляют не слишком большой интерес для программиста, поэтому мы их рассмотрим кратко.

Сложение

Вначале разберемся с сутью проблемы и попытаемся сложить два двузначных упакованных BCD-числа:

67 =01100111

+

75 =01110101

142=11011100 = 220

Как видим, в двоичном виде результат равен 1 101 1 100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что процессор не подозревает о существовании BCD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении). Этот пример иллюстрирует необходимость корректировки результатов арифметических операций с упакованными BCD-числами, так же как это было в случае неупакованных BCD чисел. Для корректировки результата сложения упакованных чисел в целях пред- ставленияего в десятичном виде процессор предоставляет команду DAA (Decimal Adjust for Addition).

Команда DAA преобразует содержимое регистра AL в две упакованные десятич- ные цифры (по алгоритму, приведенному в приложении А, где данная команда описана более подробно). Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается во флаге CF, тем самым учитывается перенос в старший разряд.

Вычитание

Аналогично сложению, при вычитании процессор рассматривает упакованные BCD-числа как двоичные. Выполним вычитание 67 - 75. Так как процессор выполняет вычитание способом сложения, то и мы последуем этому:

67 =01100111

+

-75 =10110101

-8 =00011100 = 28.

Как видим, результат равен 28 в десятичной системе счисления, что является абсурдом. В двоично-десятичном коде результат должен быть равен 0000 1000 (или 8 в десятичной системе счисления). При программировании вычитания упакован- ных BCD-чисел программист, как и при вычитании неупакованных BCD-чисел, должен сам осуществлять контроль за знаком. Это делается с помощью флага CF, который фиксирует заем из старших разрядов. Само вычитание BCD-чисел осу- ществляется обычной командой вычитания SUB или SBB. Коррекция результата вычитания для его представления в десятичном виде осуществляется командой DAS (Decimal Adjust for Substraction).

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