logo

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

Система команд 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

AAD

ASCII коррекция AX перед делением

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

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

     

*

*

?

*

?

 

Код

Команда

Описание

Проц.

Пример

D5 0A

AAD

ASCII коррекция AX перед делением

8086

aad

D5 ib

AAD imm8

Коррекция AX перед делением к числу, базирующемуся на ib

8086

aad 8

 

 

Описание:

Команда AAD (ASCII Adjust AX Before Division) относится к группе команд двоично-десятичной арифметики (Binary-Coded Decimal, BCD). Она используется для подготовки двух разрядов неупакованных BCD-цифр (наименее значащая цифра в регистре AL, наиболее значащая цифра в регистре AH) для операции деления DIV, которая возвращает неупакованный BCD-результат. Для корректного использования команды AAD исходное содержимое регистра AX (а затем и операнд последующей команды DIV) должно быть представлено в формате неупакованного двоично-десятичного (неупакованное BCD-число). В этом случае команда AAD устанавливает регистр AL в значение AL = AL + (imm8 * AH) , где imm8 – это второй байт кода операции ib (равный 0x0Ah для безоперандной мнемоники AAD), с последующей очисткой регистра AH. После команды AAD регистр AX будет равен двоичному эквиваленту оригинального неупакованного двухзначного числа. Следом должна идти команда беззнакового целочисленного деления DIV (с 8-битным делителем), которая задает делитель и помещает результат деления (частное) в регистр AL.

Для того, чтобы преобразовать содержимое регистра AL к ASCII-формату, необходимо после команд AAD и DIV выполнить команду OR AL,0x30h .

Сама по себе двоично-десятичная арифметика с преобразованием к ASCII-формату считалась устаревшей уже тогда, когда появились первые микропроцессоры. Эта методика предполагает использование для расчетов данных в ASCII-формате (в ASCII-формате цифрам 1, 2, 3, 4, ... соответствуют байт-коды 0x31h, 0x32h, 0x33h, 0x34h ...) и последующее получение результата также в ASCII-формате. Для деления это выглядит следующим образом:

mov AX,0207H   ; делимое в формате неупакованного BCD помещается в регистр AX
mov BL,05H     ; делитель в формате неупакованного BCD помещается в регистр BL
aad            ; AX = 0x001Bh
div BL         ; AX = 0x0205h
or AL,30H      ; AL = 0x35h = '5'

При ассемблировании безоперандной команды AAD второй байт кода операции ib устанавливается в значение равное 0x0Ah, тем не менее, возможно явное изменение этого байта кода операции, что может привести к другому результату (см. пункт "Операция").

Флаги EFLAGS.PFEFLAGS.ZF и EFLAGS.SF после выполнения команды AAD устанавливаются в соответствии с результатом в регистре AL. Состояние флагов EFLAGS.CF, EFLAGS.AF и EFLAGS.OF согласно технической документации производителей процессоров считается неопределенным, но по факту эти флаги сбрасываются во всех известных автору моделях процессоров.

Операция:

tempAL = AL;

tempAH = AH;

AL = (tempAH * imm8 + tempAL) AND 0x0FFh; (* imm8 - второй байт кода операции ib, который для безоперандной мнемоники AAD по-умолчанию задается равным 0x0Ah *)

AH = 0;

EFLAGS.CF = 0;(* недокументированнная операция *)

EFLAGS.AF = 0;(* недокументированнная операция *)

EFLAGS.OF = 0; (* недокументированнная операция *)

Особые ситуации защищенного режима:

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

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

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

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

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

Замечание:

К командам двоично-десятичной арифметики относятся команды DAA, DAS, AAA, AAS, AAM, AAD.

В свою очередь, сами названные команды двоично-десятичной арифметики делятся на две подгруппы. Первая подгруппа команд предназначена для так называемой ASCII-коррекции, которая используется при непосредственной работе с данными в формате ASCII или в формате упакованных двоично-десятичных данных (неупакованный BCD-формат). Подгруппа включает команды AAA, AAS, AAM, AAD. Вторая подгруппа — это команды DAA и DAS — они предназначены для коррекции операций сложения и вычитания упакованных двоично-десятичных (упакованный BCD-формат).

У команды AAD (также и у команды AAM) есть специфическая особенность, которую можно использовать для идентификации процессоров-клонов 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       Сервер радиолюбителей России - схемы, документация,

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