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

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

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

Если младшая тетрада регистра AL содержит число, большее 9, или флаг AF=1, то выполняется корректирующее сложение и увеличивается на 1 содержимое регистра AH. Далее обнуляется старшая тетрада регистра AL и флагу основного переноса CF присваивается значение флага AF. Таким образом, перенос, возникающий при сложении, учитывается дважды: в регистре AH и флаге CF. Значение CF используется при сложении длинных чисел, а инкрементирование AH при сложении не имеет смысла и используется при реализации некоторых алгоритмов умножения в ASCII-формате. Однако необходимо помнить, что команда AAA изменяет содержимое регистра AH, и, если оно существенно, то его необходимо сохранять.

Пример 3.74:

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

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

ADD AL, Y ; байтов

AAA ; Коррекция (внимание – (AH))

MOV Z, AL

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

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

AAA ; Коррекция (внимание – (AH))

MOV Z+1, AL

Рис. 3.4. Алгоритмы коррекции ASCII-сложения и ASCII-вычитания:

а) коррекция сложения командой AAA;

б) коррекция вычитания командой AAS

Команда AAA правильно формирует флаг CF. Все остальные арифметические флаги после ее выполнения неопределены.

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

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

Если младшая тетрада регистра AL содержит число большее 9 или флаг AF=1, то выполняется корректирующее вычитание и уменьшается на 1 содержимое регистра AH. Далее обнуляется старшая тетрада регистра AL и флагу основного переноса CF присваивается значение флага AF. Таким образом, заем, возникающий при вычитании, учитывается дважды: в регистре AH и флаге CF. Значение CF используется при вычитании длинных чисел, а декрементирование регистра AH при вычитании не имеет смысла и используется при реализации некоторых алгоритмов деления в ASCII-формате. Однако, необходимо помнить, что команда AAS изменяет содержимое регистра AH, и, если оно существенно, то его необходимо сохранять.

Пример 3.75:

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

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

SUB AL, Y ; байтов

AAS ; Коррекция (внимание – (AH))

MOV Z, AL

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

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

AAS ; Коррекция (внимание – (AH))

MOV Z+1, AL

Команда AAS правильно формирует флаг CF. Все остальные арифметические флаги после ее выполнения не определены.

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