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

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


examination:asm:question35

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

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

Сложение десятичных неупакованных чисел

Действие сложения неупакованных чисел на ассемблере осуществляется почисленно через регистр al, в котором хранится текущая цифра из числа. Вся работа по сложению чисел ведется в формате чисел ANSI, чтобы можно было преобразовать в упакованный формат ( не уверен). Для корректировки значений после сложения неупакованных чисел предназначена команда AAA, которая корректирует значение суммы, полученной после выполнения команд ADD и ADC. Пример.

Mov ah,0

Mov al,’8’ ;ax=0038h- число 8 в формате ANSII

Add al,’2’ ;ax=006Ah- число 10 в результате сложения

Aaa ;ax=0100h- число 10 в неупакованном формате

Or ax,3030h ;ax=3130h – число «10» в формате ANSII

То есть смысл работы с неупакованными числами в том, что мы работаем с каждой цифрой так, как если бы она была в десятичном формате, данные вычисления будет гораздо медленней, зато не будет ограничений на максимальное число

Принцип сложения- формальный принцип

Запрещённые комбинации возникают обычно в результате операций сложения, так как в двоично-десятичном представлении используются только 10 возможных комбинаций 4-х битового поля вместо 16. Поэтому, при сложении и вычитании чисел формата 8421-BCD действуют следующие правила:

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

Пример операции сложения двоично-десятичных чисел:

Требуется: Найти число A = D + C, где D = 3927, C = 4856 Решение: Представим числа D и C в двоично-десятичной форме: • D = 3927 = 0011 1001 0010 0111 • C = 4856 = 0100 1000 0101 0110

Суммируем числа D и С по правилам двоичной арифметики:

           +                  ++ 
 0011 1001 0010 0111

+ 0100 1000 0101 0110

___________________

= 1000 0001 0111 1101 - Двоичная сумма + 0110 0110 - Коррекция

___________________
1000 0111 1000 0011

'+' — тетрада, из которой был перенос в старшую тетраду

'++' — тетрада с запрещённой комбинацией битов

В тетраду помеченую символом + добавляем шестёрку т.к по правилам двоичной арифметики перенос унёс с coбой 16, а по правилам десятичной арифметики должен был унести 10. В тетраду помеченую символом ++ добавляем шестёрку и разрешаем распространение переноса так как комбинация битов 1101 (что соответствует десятичному числу 13) является запрещённой.

и иначе)

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

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

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

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

Сложение

Рассмотрим два случая сложения.

Результат сложения не больше 9:

6 = 00000110

+

3 = 00000011

9 = 00001001.

Переноса из младшей тетрады в старшую нет. Результат правильный. Результат сложения больше 9: 06 = 00000110

+

07 = 00000111

13 = 00001101.

То есть мы получили уже не BCD-число. Результат неправильный. Правильный результат в неупакованном BCD-формате в двоичном представлении должен быть таким: 0000 0001 0000 0011 (или 13 в десятичном). Проанализировав данную проблему при сложении BCD-чисел, а также возможные пути ее решения, разработчики системы команд процессора решили не вводить специальные команды для работы с BCD-числами, а ввести несколько корректировочных команд. Назначение этих команд — корректировка результата работы обычных арифметических команд для случаев, когда операнды в них являются BCD-числами. В случае сложения во втором примере видно, что полученный результат нужно корректировать. Для коррекции операции сложения двух однозначных неупакованных BCD-чисел и представления результата сложения в символьном виде в системе команд процессора существует специальная команда ААА (ASCII Adjust for Addition). Команда ААА не имеет операндов. Он работает неявно только с регистром AL и анализирует значение его младшей тетрады. Если это значение меньше 9, то флаг CF сбрасывается в 0 и осуществляется переход к следующей команде. Если это значение больше 9, то выполняются следующие действия.

1. К содержимому младшей тетрады AL (но не к содержимому всего регистра!) прибавляется 6, тем самым значение десятичного результата корректируется в правильную сторону.

2. Флаг CF устанавливается в 1, тем самым фиксируется перенос в старший раз- ряд для того, чтобы его можно было учесть в последующих действиях. Так, во втором примере сложения, предполагая, что значение суммы 0000 1101 находится в AL, после выполнения команды ААА в регистре будет 1101 + 0110 = = 0011, то есть двоичное значение 0000 0011 или десятичное значение 3, а флаг CF установится в 1, то есть перенос запоминается в процессоре. Далее программисту нужно использовать команду сложения A DC, которая учтет перенос из предыдущего разряда.

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