Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
AAM
Влияние команды на флаги и форматы команды:
? |
* |
* |
? |
* |
? |
D4 0A |
AAM |
ASCII коррекция AX после умножения |
8086 |
aam |
D4 ib |
AAM imm8 |
ASCII коррекция AX после умножения по числу, базирующемуся на ib |
8086 |
aam 5 |
Описание:
Команда AAM (ASCII Adjust AX After Multiply) относится к группе команд двоично-десятичной арифметики (Binary-Coded Decimal, BCD) и позволяет преобразовать результат умножения неупакованных двоично-десятичных данных в ASCII-формат. Для этого команда AAM должна выполняться после команды беззнакового умножения MUL (но не после команды умножения со знаком IMUL), которая помещает двухбайтный результат в регистр AX.
Для корректного использования команды AAM младшие тетрады операндов (включая исходное содержимое AL и операнд команды MUL) должны быть в диапазоне от 0 до 9 (неупакованные BCD-числа). В этом случае команда AAM распаковывает результат умножения, содержащийся в регистре AL, деля его на второй байт кода операции ib (равный 0x0Ah для безоперандной мнемоники AAM). Частное от деления (наиболее значащая цифра результата) помещается в регистр AH, а остаток (наименее значащая цифра результата) — в регистр AL .
Для того, чтобы преобразовать содержимое регистра AX к ASCII-формату, необходимо после команды AAM выполнить команду OR AX,0x3030h .
Сама по себе двоично-десятичная арифметика с преобразованием к ASCII-формату считалась устаревшей уже тогда, когда появились первые микропроцессоры. Эта методика предполагает использование для расчетов данных в ASCII-формате (в ASCII-формате цифрам 1, 2, 3, 4, ... соответствуют байт-коды 0x31h, 0x32h, 0x33h, 0x34h ...) и последующее получение результата также в ASCII-формате. Для умножения это выглядит следующим образом:
mov AL,3 ; множимое в формате неупакованного BCD помещается в регистр AL
mov BL,9 ; множитель в формате неупакованного BCD помещается в регистр BL
mul BL ; AX = 0x03 * 0x09 = 0x001Bh
aam ; AX = 0x0207h
or AX,3030H ; AX = 0x3237h, т.е. AH = '2', AL = '7'
При ассемблировании безоперандной команды AAM второй байт кода операции ib устанавливается в значение равное 0x0Ah, тем не менее, возможно явное изменение этого байта кода операции, что может привести к другому результату (см. пункт "Операция").
Флаги EFLAGS.PF, EFLAGS.ZF и EFLAGS.SF после выполнения команды AAM устанавливаются в соответствии с результатом в регистре AL. Состояние флагов EFLAGS.CF, EFLAGS.AF и EFLAGS.OF согласно технической документации производителей процессоров считается неопределенным, но по факту эти флаги сбрасываются во всех известных автору моделях процессоров.
Операция:
IF imm8 = 0 THEN DE#; FI; (* для безоперандной мнемоники AAM принимается imm8 = 0x0Ah *)
tempAL = AL;
AH = tempAL / imm8;
AL = tempAL MOD imm8;
EFLAGS.CF = 0; (* недокументированнная операция *)
EFLAGS.AF = 0; (* недокументированнная операция *)
EFLAGS.OF = 0; (* недокументированнная операция *)
Особые ситуации защищенного режима:
#DE, если непосредственный операнд команды задан равным нулю.
Особые ситуации режима реальной адресации:
#DE, если непосредственный операнд команды задан равным нулю.
Особые ситуации режима V86:
#DE, если непосредственный операнд команды задан равным нулю.
Замечание:
К командам двоично-десятичной арифметики относятся команды DAA, DAS, AAA, AAS, AAM, AAD.
В свою очередь, сами названные команды двоично-десятичной арифметики делятся на две подгруппы. Первая подгруппа команд предназначена для так называемой ASCII-коррекции, которая используется при непосредственной работе с данными в формате ASCII или в формате упакованных двоично-десятичных данных (неупакованный BCD-формат). Подгруппа включает команды AAA, AAS, AAM, AAD. Вторая подгруппа — это команды DAA и DAS — они предназначены для коррекции операций сложения и вычитания упакованных двоично-десятичных (упакованный BCD-формат).
У команды AAM (также и у команды AAD) есть специфическая особенность, которую можно использовать для идентификации процессоров-клонов V20/V30 производства компании NEC. Процессоры Intel используют второй байт кода операции ib для задания системы исчисления (imm8 в пункте "Операция"). То есть, используя разные значения для ib, можно производить коррекцию не только для десятичной системы исчисления и получать разные результаты. В процессорах V20/V30 всегда используется основание 10 (imm8 = 10), а значение второго байта кода операции игнорируется. Следующий код позволяет отличать эти процессоры от продукции Intel.
mov AX, 0f0fh
db 0d5h, 10h ; код операции AAD 16
cmp AL, 0ffh ; проверка равен ли множитель 10
jnz cpu_NEC_V20_V30 ; процессор V20/V30
jz cpu_Intel_808x ; процессор Intel
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru