Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 2).doc
Скачиваний:
155
Добавлен:
08.03.2015
Размер:
380.93 Кб
Скачать

Умножение в ascii-формате

Умножение в ASCII-формате выполняется в два этапа: сначала байты операндов умножаются как двоичные числа с помощью команды MUL, а затем осуществляется коррекция результата командой AAM.

При умножении двух неупакованных чисел, находящихся в диапазоне 09, командой MUL будет получен результат в диапазоне 081, представленный двоичным числом. Команда коррекции AAM преобразует полученный результат из двоичной формы в ASCII-формат. Для этого она осуществляет деление содержимого регистра AL на 10 с размещением частного в регистре AH, а остатка  в регистре AL. Таким образом, команда AAM реализует операции:

(AH) = (AL)/10, (AL) = (AL) mod 10.

Отсюда следует, что команду AAM можно рассматривать как специализированную команду деления беззнакового числа из регистра AL на 10.

Команда AAM правильно формирует флаги SF, ZF и PF по результату в регистре AL. При этом всегда SF = 0, так как результат коррекции представлен в ASCII-формате, а ZF = 1, если исходное число кратно 10. Флаги CF, AF и OF изменяются неопределенным образом.

Пример 3.76:

Вычислить Z=XY, где X–десятичное ASCII-слово, а Y–ASCII-байт в памяти.

Для умножения в ASCII-формате необходимо прежде всего представить схему умножения, которая для заданного примера имеет вид:

Из анализа этой схемы следует, что вычисление произведения сводится к вычислению частичных произведений с последующим их суммированием с учетом соответствующих весов.

Программа, реализующая эту схему, имеет вид:

MOV AL , X ; Загрузка X0

MUL Y ; Вычисление Z'00Z00=X0Y0

AAM ; Коррекция умножения

MOV Z , AX ; Запись Z'00Z00 в память

MOV AL , X+1 ; Загрузка X1

MUL Y ; Вычисление Z'01Z01=X1Y0

AАM ; Коррекция умножения

ADD AL , Z+1 ; Сложение Z'00+Z01

AAA ; Коррекция сложения

MOV Z+1, AX ; Запись Z2Z1 в память

Рассмотренные алгоритм и программа умножения чисел в ASCII-формате могут быть обобщены для умножения чисел произвольной разрядности.

Деление в ascii-формате

Деление в ASCII-формате выполняется в два этапа: сначала осуществляется десятичная коррекция делимого с помощью команды AAD, а затем выполняется деление операндов командой DIV.

Команда коррекции AAD преобразует неупакованное делимое, находящееся в регистре AX, из ASCII-формата в двоичную форму и загружает его в регистр AL. При этом она предполагает, что регистр AH содержит старшую цифру, а регистр AL – младшую цифру делимого с нулевым значением старших тетрад в обоих регистрах.

Таким образом, при выполнении команды AAD реализуются следующие действия:

1) вычисляется значение (AL) = (AH)  10 + (AL);

2) обнуляется регистр AH.

После коррекции делимое находится в регистре AX в двоичной форме и готово для деления на одноразрядный десятичный делитель в ASCII-формате, которое и выполняется командой DIV.

Команда AAD правильно формирует флаги SF,ZF и PF по результату в регистре AL. Остальные арифметические флаги становятся неопределенными.

Пример 3.77:

Вычислить Z=X/Y, где X –десятичное ASCII-слово, а Y –ASCII-байт в памяти.

В соответствии с правилами арифметики деление начинается со старшей цифры.

MOV AH , 0 ;Загрузка старшей цифры

MOV AL , X+1 ;делимого в AX

DIV Y ;Деление старшей цифры

MOV Z+1, AL ;Запись старшей цифры частного

MOV AL , X ;Загрузка младшей цифры делимого

AAD ;Коррекция делимого

DIV Y ;Деление младшей цифры

MOV Z , AL ;Запись младшей цифры частного

MOV R , AH ;Запись остатка

Рассмотренные алгоритм и программа деления чисел в ASCII-формате могут быть обобщены для деления многоразрядного делимого на одноразрядный делитель.

При необходимости деления чисел в ASCII-формате на многоразрядный делитель все операнды должны быть преобразованы в двоичную форму и выполнено двоичное деление с последующим преобразованием результата в ASCII-формат.