Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
AAS
Влияние команды на флаги и форматы команды:
? |
? |
? |
* |
? |
* |
3F |
AAS |
ASCII коррекция AL после вычитания |
8086 |
aas |
Описание:
Команда AAS (ASCII Adjust After Subtraction) относится к группе команд двоично-десятичной арифметики (Binary-Coded Decimal, BCD) и позволяет преобразовать результат вычитания двоично-десятичных данных в ASCII-формат. Для этого команда AAS должна выполняться после команды двоичного вычитания SUB, которая помещает однобайтный результат в регистр AL.
Для корректного использования команды AAS младшая тетрада операнда предшествующей команды SUB должна быть в диапазоне от 0 до 9 (BCD-цифры). В этом случае команда AAS корректирует регистр AL таким образом, что он будет содержать правильную двоично-десятичную цифру, соответствующую результату вычитания двух двоично-десятичных значений (операнд команды SUB вычитается из исходного содержимого AL). Если при вычитании командой SUB происходит десятичный перенос (EFLAGS.AF = 1), то регистр AH уменьшается на единицу, а также устанавливаются флаги EFLAGS.CF и EFLAGS.AF. Если при вычитании десятичного переноса не возникло (EFLAGS.AF = 0), тогда сбрасываются флаги EFLAGS.CF и EFLAGS.AF, а регистр AH не изменяется. Во всех случаях старшая тетрада регистра AL обнуляется.
Для того, чтобы преобразовать содержимое регистра AL к ASCII-формату, необходимо после команды AAS выполнить команду OR AL,0x30h .
Сама по себе двоично-десятичная арифметика с преобразованием к ASCII-формату считалась устаревшей уже тогда, когда появились первые микропроцессоры. Эта методика предполагает использование для расчетов данных в ASCII-формате (в ASCII-формате цифрам 1, 2, 3, 4, ... соответствуют байт-коды 0x31h, 0x32h, 0x33h, 0x34h ...) и последующее получение результата также в ASCII-формате. При положительном результате вычитания это выглядит следующим образом:
sub AH,AH ; очистка AH
mov AL,'9' ; AL = 0x39h
sub AL,'3' ; AL = 0x39h - 0x33h = 0x06h
aas ; AX = 0x0006h
or AL,30H ; AL = 0x36h
при вычитании с получением результа меньше нуля:
sub AH,AH ; очистка AH
mov AL,'3' ; AL = 0x33h
sub AL,'9' ; AL = 0x33h - 0x39h = 0xFAh
aas ; AX = 0xFF04h
or AL,30H ; AL = 0x34h = '4'
Операция:
IF ( (AL AND 0x0Fh) > 9 or EFLAGS.AF = 1 )
THEN
IF (Процессор Intel286, ...)
THEN AL = AL - 0x06h;
ELSE AX = AX - 0x0006h;
FI;
AH = AH - 0x01h;
EFLAGS.AF = 1;
EFLAGS.CF = 1;
ELSE
EFLAGS.CF = 0;
EFLAGS.AF = 0;
FI;
AL = AL AND 0x0Fh;
Замечание:
К командам двоично-десятичной арифметики относятся команды DAA, DAS, AAA, AAS, AAM, AAD.
В свою очередь, сами названные команды двоично-десятичной арифметики делятся на две подгруппы. Первая подгруппа команд предназначена для так называемой ASCII-коррекции, которая используется при непосредственной работе с данными в формате ASCII или в формате упакованных двоично-десятичных данных (неупакованный BCD-формат). Подгруппа включает команды AAA, AAS, AAM, AAD. Вторая подгруппа — это команды DAA и DAS — они предназначены для коррекции операций сложения и вычитания упакованных двоично-десятичных (упакованный BCD-формат).
В процессорах 8086/8088 и 80186/80188 реализация команд AAA, AAS была не вполне корректной, что дополнительно способствовалу тому, что их и использовали достаточно редко.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru