Деление неупакованных BCD-чисел 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Деление неупакованных BCD-чисел



Процесс выполнения операции деления двух неупакованных BCD-чисел несколько отличается от других, рассмотренных ранее, операций с ними. Здесь также требуются действия по коррекции, но они должны выполняться до основной операции, выполняющей непосредственно деление одного BCD-числа на другое BCD-число. Предварительно в регистре ax нужно получить две неупакованные BCD-цифры делимого. Это делает программист удобным для него способом. Далее нужно выдать команду aad:

aad (ASCII Adjust for Division) — коррекция деления для представления в символьном виде.

Команда не имеет операндов и преобразует двузначное неупакованное BCD-число в регистре ax в двоичное число. Это двоичное число впоследствии будет играть роль делимого в операции деления. Кроме преобразования, команда aad помещает полученное двоичное число в регистр al. Делимое, естественно, будет двоичным числом из диапазона 0...99.
Алгоритм, по которому команда aad осуществляет это преобразование, состоит в следующем:

  • умножить старшую цифру исходного BCD-числа в ax (содержимое ah) на 10;
  • выполнить сложение ah + al, результат которого (двоичное число) занести в al;
  • обнулить содержимое ah.

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

Деление неупакованных BCD-чисел иллюстрируется листингом 11.

Листинг 11. Деление неупакованных BCD-чисел<1>;prg_8_11.asm<2>...<3>.data;сегмент данных<4> b db 1,7;неупакованное BCD-число 71<5> c db 4; <6> ch db 2 dup (0)<7>.code;сегмент кода<8> main:;точка входа в программу<9>...<10> mov al,b<11> aad;коррекция перед делением <12> div c;в al BCD-частное, в ah BCD-остаток<13>...<14> exit:

Аналогично aam, команде aad можно найти и другое применение — использовать ее для перевода неупакованных BCD-чисел из диапазона 0...99 в их двоичный эквивалент.

Для деления чисел большей разрядности, так же как и в случае умножения, нужно реализовывать свой алгоритм, например “в столбик”, либо найти более оптимальный путь.

Арифметические действия над упакованными BCD-числами

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

Сложение упакованных BCD-чисел

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

Пример 13.

Сложение упакованных BCD-чисел

67 = 0110 0111 + 75 = 0111 0101 = 142 = 1101 1100 = 220

Как видим, в двоичном виде результат равен 1101 1100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что микропроцессор не подозревает о существовании BCD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле, результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении).

Видно, что как и для неупакованных BCD-чисел, для упакованных BCD-чисел существует потребность как-то корректировать результаты арифметических операций.
Микропроцессор предоставляет для этого команду daa:

daa (Decimal Adjust for Addition) — коррекция результата сложения для представления в десятичном виде.
Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по алгоритму, приведенному в описании команды daa.
Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается в флаге cf, тем самым учитывается перенос в старший разряд.

Проиллюстрируем сказанное на примере сложения двух двузначных BCD-чисел в упакованном формате (листинг 12).

Листинг 12. Сложение упакованных BCD-чисел<1>;prg_8_12.asm<2>...<3>.data;сегмент данных<4> b db 17h;упакованное число 17h<5> c db 45h;упакованное число 45<6> sumdb 2 dup (0) <7>.code;сегмент кода<8> main:;точка входа в программу<9>...<10> mov al,b<11> add al,c<12> daa <13> jnc $+4;переход через команду, если результат <= 99<14> mov sum+1,ah;учет переноса при сложении (результат > 99)<15> mov sum,al;младшие упакованные цифры результата<16> exit:

В приведенном примере все достаточно прозрачно, единственное, на что следует обратить внимание, — это описание упакованных BCD-чисел и порядок формирования результата. Результат формируется в соответствии с основным принципом работы микропроцессоров Intel: младший байт по младшему адресу.



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 677; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.179.186 (0.004 с.)