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

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


examination:asm:question38

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

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

Деление двоично-десятичных чисел

Для корректировки результатов делимого для выполнения команды div служит команда AAD, причем деление не может осуществляться в формате ANSII.

Пример

Mov bl,05h ;bx=0005h

Mov ax,0307h ;ax=0307h

Aad ;ax=0025h – корректировка результата перед делением

div bl ;ax=0207h – al- младшее число- ответ=7, старшее ah-остаток=2

и иначе)

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

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

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

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

Деление

Процесс деления двух неупакованных BCD-чисел несколько отличается от других рассмотренных ранее операций с ними. Здесь также требуются действия по коррекции, но они должны выполняться до основной операции, выполняющей непосредственно деление одного BCD-числа на другое BCD-число. Предварительно в регистре АХ нужно получить две неупакованные BCD-цифры делимого. Это делает программист удобным для него способом. Далее для коррекции результата деления в целях представления его в символьном виде нужно выполнить команду AAD (ASCII Adjust for Division).

Команда AAD не имеет операндов и преобразует двузначное неупакованное BCD- число в регистре АХ в двоичное число, которое впоследствии будет играть роль делимого в операции деления. Кроме преобразования, команда AAD помещает по- лученное двоичное число в регистр AL. Делимое, естественно, является двоичным числом из диапазона 0…99. Алгоритм, по которому команда AAD осуществляет это преобразование, выглядит следующим образом.

1. Умножить на 10 старшую цифру исходного BCD-числа в АХ (содержимое АН).

2. Выполнить сложение АН + AL, результат которого (двоичное число) занести в AL.

3. Обнулить содержимое АН.

Далее программисту нужно выполнить обычную команду деления DIV для де- ления содержимого АХ на одну BCD-цифру, находящуюся в байтовом регистре или байтовой ячейке памяти.

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