Арифметические команды
2) поместить второй операнд в регистр или память, отведя байт;
3) перемножить сомножители командой mul (результат, как и положено, будет в ах);
4) результат, конечно, получится в двоичном коде, поэтому его нужно скорректировать.
Для коррекции результата после умножения применяется специальная команда – aam (ASCII Adjust for Multiplication) – коррекция результата умножения для представления в символьном виде.
Она не имеет операндов и работает с регистром АХ следующим образом:
1) делит al на 10;
2) результат деления записывается так: частное в al, остаток в ah. В результате после выполнения команды aam в регистрах AL и ah находятся правильные двоично-десятичные цифры произведения двух цифр.
Перед окончанием обсуждения команды aam необходимо отметить еще один вариант ее применения. Эту команду можно применять для преобразования двоичного числа в регистре AL в неупакованное BCD-число, которое будет размещено в регистре ах: старшая цифра результата в ah, младшая – в al. Понятно, что двоичное число должно быть в диапазоне 0… 99.
Деление неупакованных BCD-чисел
Процесс выполнения операции деления двух неупакованных BCD-чисел несколько отличается от других, рассмотренных ранее операций с ними. Здесь также требуются действия по коррекции, но они должны осуществляться до основной операции, выполняющей непосредственно деление одного BCD-числа на другое BCD-число. Предварительно в регистре ах нужно получить две неупакованные BCD-цифры делимого. Это делает программист удобным для него способом. Далее нужно выдать команду aad – aad (ASCII Adjust for Division) – коррекция деления для представления в символьном виде.
Команда не имеет операндов и преобразует двузначное неупакованное BCD-число в регистре ах в двоичное число. Это двоичное число впоследствии будет играть роль делимого в операции деления. Кроме преобразования, команда aad помещает полученное двоичное число в регистр AL. Делимое, естественно, будет двоичным числом из диапазона 0… 99.
Алгоритм, по которому команда aad осуществляет это преобразование, состоит в следующем:
1) умножить старшую цифру исходного BCD-числа в ах (содержимое АН) на 10;
2) выполнить сложение АН + AL, результат которого (двоичное число) занести в AL;
3) обнулить содержимое АН.
Далее программисту нужно выдать обычную команду деления div для выполнения деления содержимого ах на одну BCD-цифру, находящуюся в байтовом регистре или байтовой ячейке памяти.
Аналогично ааш, команде aad можно найти и другое применение – использовать ее для перевода неупакованных BCD-чисел из диапазона 0… 99 в их двоичный эквивалент.
Для деления чисел большей разрядности, так же как и в случае умножения, нужно реализовывать свой алгоритм, например «в столбик», либо найти более оптимальный путь. Арифметические действия над упакованными BCD-числами
Как уже отмечалось выше, упакованные BCD-числа можно только складывать и вычитать. Для выполнения других действий над ними их нужно дополнительно преобразовывать либо в неупакованный формат, либо в двоичное представление. Из-за того, что упакованные BCD-числа представляют не слишком большой интерес, мы их рассмотрим кратко.
Сложение упакованных BCD-чисел
Вначале разберемся с сутью проблемы и попытаемся сложить два двузначных упакованных BCD-числа. Пример Сложение упакованных BCD-чисел:
67 = 01100111
+
75 = 01110101
=
142 = 1101 1100 = 220
Как видим, в двоичном виде результат равен 1101 1100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что микропроцессор не подозревает о существовании BCD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле, результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении).
Видно, что, как и для неупакованных BCD-чисел, для упакованных BCD-чисел существует потребность как-то корректировать результаты арифметических операций.
Микропроцессор предоставляет для этого команду daa – daa (Decimal Adjust for Addition) – коррекция результата сложения для представления в десятичном виде.
Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по алгоритму, приведенному в описании команды daa Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается в флаге cf, тем самым учитывается перенос в старший разряд.
Вычитание упакованных BCD-чисел
Аналогично сложению, микропроцессор рассматривает упакованные BCD-числа как двоичные и, соответственно, выполняет вычитание BCD-чисел как двоичных.