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

Команды десятичной коррекции

Выполнение любой арифметической операции над десятичными числами сводится к выполнению соответствующей двоичной операции с последующей десятичной коррекцией результата или предшествующей коррекцией операнда. При этом десятичные числа могут обрабатываться только побайтно, и все операции должны выполняться в регистре AL, так как вся коррекция реализуется только для этого регистра.

Сложение в bdc-формате

Сложение в BDC-формате выполняется в два этапа: сначала байты операндов суммируются как двоичные числа с помощью команд ADD или ADC, а затем осуществляется коррекция результата командой DAA. Коррекция реализуется следующим образом:

1) если (AF=1)(ALL>9), то (AL)=(AL)+06h;

2) если (CF=1)(ALH>9), то (AL)=(AL)+60h.

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

Пример 3.72:

Вычислить Z=X+Y, где X, Y -десятичные BCD-слова в памяти.

MOV AL, X ; Сложение младших

ADD AL, Y ; байтов

DAA ; Коррекция

MOV Z, AL

MOV AL, X+1 ; Сложение старших

ADC AL, Y+1 ; байтов

DAA ; Коррекция

MOV Z+1, AL

Команда DAA правильно формирует все арифметические флаги, кроме OF, значение которого не определено.

Вычитание в bcd-формате

Вычитание в BCD-формате также выполняется в два этапа: сначала байты операндов вычитаются как двоичные числа с помощью команд SUB или SBB, а затем осуществляется коррекция результата командой DAS. Коррекция реализуется следующим образом:

1) если (AF=1)(ALL>9), то (AL)=(AL)06h;

2) если (CF=1)(ALH>9), то (AL)=(AL)–60h.

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

Пример 3.73:

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

MOV AL, X ; Вычитание младших

SUB AL, Y ; байтов

DAS ; Коррекция

MOV Z, AL

MOV AL, X+1 ; Вычитание старших

SBB AL, Y+1 ; байтов

DAS ; Коррекция

MOV Z+1, AL

Команда DAS правильно формирует все арифметические флаги, кроме OF, значение которого не определено.

При получении отрицательной разности флаг CF=1, и результат представлен в дополнительном десятичном коде.

Умножение и деление в BCD-формате невозможно. Это обусловлено тем, что в данном формате байт содержит две десятичные цифры, а простых алгоритмов умножения и деления сразу на две цифры неизвестно.

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