(Ascii Adjust before Division)
ASCII-коррекция перед делением
Назначение:
- подготовкa двух неупакованных BCD-чисел для операции деления;
- преобразование двузначного неупакованного ВCD-числа меньшего 63h (9910) в двоичное представление.
Синтаксис
Алгоритм работы:
- умножить значение регистра ah на 10 и сложить полученное значение с содержимым регистра al: (ah*10)+al;
- присвоить регистру al значение (ah*10)+al;
- обнулить регистр ah.
Состояние флагов после выполнения команды:
|
|
|
|
|
|
OF
| SF
| ZF
| AF
| PF
| CF
|
?
| r
| r
| r
| r
| ?
|
Применение:
Команду aad используют для подготовки двузначного неупакованного BCD-числа в регистре ax для операции деления. Так как в системе команд микропроцессора нет команды деления для BCD-чисел, такое число нужно предварительно преобразовать в двоичный вид. Для этого старший разряд двузначного BCD-числа помещается в регистр ah, умножается на 10 и складывается с разрядом единиц двузначного BCD-числа 9 в регистре al. В результате этих действий и получается соответствующее двоичное число в регистре ax. Далее в программе уже можно применять обычную команду деления div, оперирующую двоичными данными. Команду aad можно применять и просто для преобразования неупакованного двузначного BCD-числа в его двоичный эквивалент. Есть еще интересный момент — если посмотреть на коды символов шестнадцатеричных цифр в таблице ASCII, то видно, что они похожи на BCD-числа. Исключение составляет лишь значение старшей тетрады (для BCD-числа это так называемая зона с нулевым значением) - оно равно 3. Можно сделать вывод, что если предварительно обнулить значение старшей тетрады для кодов двух символов (от 0 до 9), то эту команду вполне можно применять и для преобразования двузначных десятичных чисел в символьном представлении в их двоичный эквивалент, что и отражено в названии команды. Для иллюстрации рассмотрим два примера.
Пример 1. Разделить десятичное число 18 на 9. Подготовить результат к выводу на экран.
mov ah,01h ;ah=01h mov al,08h ;al=08h => ax=0108h mov bl,09 ;bl=09h aаd ;al=12h — двоичный эквивалент десятичного числа 18 div bl ;al=02h,ah=00h ог al,30h ;al=32h — ASCII-представление числа 2, можно выводить на экран |
Пример 2. Преобразовать десятичное число 16 в символьном виде в эквивалентное двоичное число.
mov ax,3136h ;ax=3136h and ax,0f0fh ;ax=0106h aаd ;al=10h — получили его двоичный эквивалент |
См. также: уроки 3, 8, приложение 7 и команды aaa, aam, aas, daa, das