- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
Умножение в ascii-формате
Умножение в ASCII-формате выполняется в два этапа: сначала байты операндов умножаются как двоичные числа с помощью команды MUL, а затем осуществляется коррекция результата командой AAM.
При умножении двух неупакованных чисел, находящихся в диапазоне 09, командой MUL будет получен результат в диапазоне 081, представленный двоичным числом. Команда коррекции AAM преобразует полученный результат из двоичной формы в ASCII-формат. Для этого она осуществляет деление содержимого регистра AL на 10 с размещением частного в регистре AH, а остатка в регистре AL. Таким образом, команда AAM реализует операции:
(AH) = (AL)/10, (AL) = (AL) mod 10.
Отсюда следует, что команду AAM можно рассматривать как специализированную команду деления беззнакового числа из регистра AL на 10.
Команда AAM правильно формирует флаги SF, ZF и PF по результату в регистре AL. При этом всегда SF = 0, так как результат коррекции представлен в ASCII-формате, а ZF = 1, если исходное число кратно 10. Флаги CF, AF и OF изменяются неопределенным образом.
Пример 3.76:
Вычислить Z=XY, где X–десятичное ASCII-слово, а Y–ASCII-байт в памяти.
Для умножения в ASCII-формате необходимо прежде всего представить схему умножения, которая для заданного примера имеет вид:
Из анализа этой схемы следует, что вычисление произведения сводится к вычислению частичных произведений с последующим их суммированием с учетом соответствующих весов.
Программа, реализующая эту схему, имеет вид:
MOV AL , X ; Загрузка X0
MUL Y ; Вычисление Z'00Z00=X0Y0
AAM ; Коррекция умножения
MOV Z , AX ; Запись Z'00Z00 в память
MOV AL , X+1 ; Загрузка X1
MUL Y ; Вычисление Z'01Z01=X1Y0
AАM ; Коррекция умножения
ADD AL , Z+1 ; Сложение Z'00+Z01
AAA ; Коррекция сложения
MOV Z+1, AX ; Запись Z2Z1 в память
Рассмотренные алгоритм и программа умножения чисел в ASCII-формате могут быть обобщены для умножения чисел произвольной разрядности.
Деление в ascii-формате
Деление в ASCII-формате выполняется в два этапа: сначала осуществляется десятичная коррекция делимого с помощью команды AAD, а затем выполняется деление операндов командой DIV.
Команда коррекции AAD преобразует неупакованное делимое, находящееся в регистре AX, из ASCII-формата в двоичную форму и загружает его в регистр AL. При этом она предполагает, что регистр AH содержит старшую цифру, а регистр AL – младшую цифру делимого с нулевым значением старших тетрад в обоих регистрах.
Таким образом, при выполнении команды AAD реализуются следующие действия:
1) вычисляется значение (AL) = (AH) 10 + (AL);
2) обнуляется регистр AH.
После коррекции делимое находится в регистре AX в двоичной форме и готово для деления на одноразрядный десятичный делитель в ASCII-формате, которое и выполняется командой DIV.
Команда AAD правильно формирует флаги SF,ZF и PF по результату в регистре AL. Остальные арифметические флаги становятся неопределенными.
Пример 3.77:
Вычислить Z=X/Y, где X –десятичное ASCII-слово, а Y –ASCII-байт в памяти.
В соответствии с правилами арифметики деление начинается со старшей цифры.
MOV AH , 0 ;Загрузка старшей цифры
MOV AL , X+1 ;делимого в AX
DIV Y ;Деление старшей цифры
MOV Z+1, AL ;Запись старшей цифры частного
MOV AL , X ;Загрузка младшей цифры делимого
AAD ;Коррекция делимого
DIV Y ;Деление младшей цифры
MOV Z , AL ;Запись младшей цифры частного
MOV R , AH ;Запись остатка
Рассмотренные алгоритм и программа деления чисел в ASCII-формате могут быть обобщены для деления многоразрядного делимого на одноразрядный делитель.
При необходимости деления чисел в ASCII-формате на многоразрядный делитель все операнды должны быть преобразованы в двоичную форму и выполнено двоичное деление с последующим преобразованием результата в ASCII-формат.