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