Символьная коррекция умножение
Символьная коррекция: умножение
Когда в программе перемножаются два неупакованных десятичных числа,
результат в регистре AL является двоичным числом. Поскольку
наибольшее неупакованное десятичное в двоичном представлении число
равно 9, то максимальный результат при BCD-умножении без упаковки
равен 81. Однако, этот результат не является значимым неупакованным
BCD-представлением этого числа. Команда символьной коррекции для
умножения (AAM - от ASCII Adjust for Multiply) переводит такой
двоичный результат в неупакованный десятичный. Командой AAM старшая
десятичная цифра результата помещается в регистр AH, а в AL
остается младшая десятичная цифра. Например, если программа
перемножает значения 6 и 7 и результат в AL равен 2AH, то команда
AAM преобразует результат, помещая в AH 04H, а в AL - 02H, что
соответсвует неупакованному десятичному числу 42 в регистрах AH:AL.
Команда AAM вычисляет распакованный десятичный результат с
помощью деления числа в регистре AL на 10. Она помещает частное в
регистр AH, оставляя остаток в регистре AL. Команда AAM
устанавливает флаги нуля и знака в соответствии с результатом в
регистре AL. Так как результат - распакованное десятичное число,
знак всегда положителен, а знак нуля устанавливается равным 1,
только если исходное число кратно 10 - т.е. если младшая значащая
десятичная цифра равна 0. Остальные флаги после команды AAM
остаются неопределенными. Флаг переноса теперь не имеет смысла,
потому что умножение двух распакованных десятичных чисел никогда не
дает результата, превосходящего число, представимое двумя
десятичными цифрами.
Программа также всегда может использовать команду AAM для
деления двоичного числа в регистре AL на 10. В таком виде она может
рассматриваться, как специальный случай команды деления, которая
делит однобайтовое число в регистре AL на 10. Частное помещается в
регистр AH, остаток - в регистр AL.