Меню сайта

Урок 61. Символьная коррекция: деление

Так же, как и другие арифметическиеоперации, деление имеет
— — — соответствующую команду для обслуживанияраспакованных десятичных
— — — чисел. -Однако в отличие от других команд, програииа должна
— — — выполнять команду символьной коррекцииделения AAD до выполнения
— — — команды деления. — Команда AAD берет две цифры распакованного
— — — десятичного числа из регистра AX (старшаязначащая цифра адресуется
— — — в регистре AH) и преобразует его вдвоичное число в регистре AL,
— — — оставляя в регистре AH нуль. — После этого в регистре AX оказывается
— — — значение, готовое для деления надесятичное распакованное число,
— — — состоящее из одной цифры. — Команда AAD устанавливает коды условия в
— — — соответствии с результатом в регистреAL. — Флаги нечетности, знака
— — — и нуля соответствуют значению AL, аостальные неизвестны.

— — — — — Есть случаи, когда после деления можетоказаться, что частное —
— — — это не одна десятичная цифра. Такполучается потому, что в этом
— — — случае переполнение после деления нерегистрируется. В худшем
— — — случае 99 делится на 1, давая частное 99,число, меньшее
— — — максимального как для команды DIV, так идля команды IDIV, так что
— — — переполнение не возникает. Однако эточисло больше максимального
— — — распакованного десятичного числа из однойцифры, которое равно 9.
— — — Существует два метода борьбы с такимслучаем. Во=первых, после
— — — каждой последовательности команд AAD=DIVможно проверять, не
— — — превысило ли частное 9, и вызыватьсоответствующую обработку
— — — переполнения. Или программа можетиспользовать команду AAM после
— — — деления, чтобы преобразовать частное в распакованноедесятичное
— — — число из двух цифр. Но в этом случаепрограмма должна где=либо
— — — сохранить остаток до выполнения командыAAM, так как она разрушит
— — — содержимое регистра AH. Этот способпорождает десятичный результат,
— — — состоящий из двух цифр, после делениязначения из двух цифр на
— — — число из одной цифры. Но еслираспакованный десятичный делитель
— — — нулевой, то деление вызовет прерывание поделению на нуль,
— — — показывая, что произошло переполнение приделении.

Категория: Программирование на Ассемблере | Дата: 07.02.13

Меню раздела
Блок