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

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


examination:asm:question37

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

Суть двоично-десятичных двоичных чисел заключается в том, что на запись каждой цифры отводится 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

Умножение двоично-десятичных чисел

Для корректировки результатов умножения служит команда AAM, причем умножение не может осуществляться в формате ANSII. Обязательно нужно, чтобы старшие биты числа были равны нулю

Пример

Mov bl,06h ;bx=0006h

Mov al,05h ;ax=0005h

Mul bl ;ax=001Eh

Aam ;ax=0300h – корректировка результата после умножения

и иначе)

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

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

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

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

Умножение

На примере сложения и вычитания неупакованных чисел мы выяснили, что стандартных алгоритмов для выполнения этих действий над BCD-числами нет и программист должен сам, исходя из требований к своей программе, реализовать эти операции. Реализация двух оставшихся операций — умножения и деления — еще сложнее. В системе команд процессора присутствуют только средства для умножения и деления одноразрядных неупакованных BCD-чисел. Для их умножения необходимо воспроизвести описанную далее процедуру.

1. Поместить один из сомножителей в регистр AL (как того требует команда MUL).

2. Поместить второй сомножитель в регистр или память, отведя для него байт.

3. Перемножить сомножители командой MUL (результат, как и положено, окажет- ся в регистре АХ).

4. Скорректировать результат, который, конечно, будет представлен в двоичном коде.

Для коррекции результата после умножения в целях представления его в сим- вольном виде применяется специальная команда ААМ (ASCII Adjust for Multiplication). Она не имеет операндов и работает с регистром АХ следующим образом.

1. Делит AL на 10.

2. Результат деления записывается так: частное — в AL, остаток — в АН.

В результате после выполнения команды ААМ в регистрах AL и АН находятся правильные двоично-десятичные цифры произведения двух цифр.

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