logo

Главная Система команд x86 Базовая система команд CPU AAM

Система команд x86

Программирование - Архитектура и система команд микропроцессоров x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

AAM

ASCII коррекция AX после умножения

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

     

*

*

?

*

?

 

Код

Команда

Описание

Проц.

Пример

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.PFEFLAGS.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, если непосредственный операнд команды задан равным нулю.

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима реальной адресации:

#DE, если непосредственный операнд команды задан равным нулю.

Intel386 … :
#UD при использовании префикса LOCK.

Особые ситуации режима V86:

#DE, если непосредственный операнд команды задан равным нулю.

Intel386 … :
#UD при использовании префикса LOCK.

Замечание:

К командам двоично-десятичной арифметики относятся команды 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


Входит в группу команд: Базовая система команд CPU




Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Top.Mail.Ru       Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники