- •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. Команды обработки строк
- •Строковые примитивы
Команды десятичной коррекции
Выполнение любой арифметической операции над десятичными числами сводится к выполнению соответствующей двоичной операции с последующей десятичной коррекцией результата или предшествующей коррекцией операнда. При этом десятичные числа могут обрабатываться только побайтно, и все операции должны выполняться в регистре AL, так как вся коррекция реализуется только для этого регистра.
Сложение в bdc-формате
Сложение в BDC-формате выполняется в два этапа: сначала байты операндов суммируются как двоичные числа с помощью команд ADD или ADC, а затем осуществляется коррекция результата командой DAA. Коррекция реализуется следующим образом:
1) если (AF=1)(ALL>9), то (AL)=(AL)+06h;
2) если (CF=1)(ALH>9), то (AL)=(AL)+60h.
Команда DAA преобразует содержимое регистра AL в правильный BCD-формат. Коррекция заключается в последовательном прибавлении корректирующих шестерок к младшей и старшей тетрадам AL при наличии необходимых условий. При втором корректирующем сложении учитывается перенос AF, формирующийся при первом корректирующем сложении.
Пример 3.72:
Вычислить Z=X+Y, где X, Y -десятичные BCD-слова в памяти.
MOV AL, X ; Сложение младших
ADD AL, Y ; байтов
DAA ; Коррекция
MOV Z, AL
MOV AL, X+1 ; Сложение старших
ADC AL, Y+1 ; байтов
DAA ; Коррекция
MOV Z+1, AL
Команда DAA правильно формирует все арифметические флаги, кроме OF, значение которого не определено.
Вычитание в bcd-формате
Вычитание в BCD-формате также выполняется в два этапа: сначала байты операндов вычитаются как двоичные числа с помощью команд SUB или SBB, а затем осуществляется коррекция результата командой DAS. Коррекция реализуется следующим образом:
1) если (AF=1)(ALL>9), то (AL)=(AL)06h;
2) если (CF=1)(ALH>9), то (AL)=(AL)–60h.
Команда DAS преобразует содержимое регистра AL в правильный BCD-формат. Коррекция заключается в последовательном вычитании корректирующих шестерок из младшей и старшей тетрад AL при наличии необходимых условий. При втором корректирующем вычитании учитывается заем AF, формирующийся при первом корректирующем вычитании.
Пример 3.73:
Вычислить Z=X–Y, где X, Y –десятичные BCD-слова в памяти.
MOV AL, X ; Вычитание младших
SUB AL, Y ; байтов
DAS ; Коррекция
MOV Z, AL
MOV AL, X+1 ; Вычитание старших
SBB AL, Y+1 ; байтов
DAS ; Коррекция
MOV Z+1, AL
Команда DAS правильно формирует все арифметические флаги, кроме OF, значение которого не определено.
При получении отрицательной разности флаг CF=1, и результат представлен в дополнительном десятичном коде.
Умножение и деление в BCD-формате невозможно. Это обусловлено тем, что в данном формате байт содержит две десятичные цифры, а простых алгоритмов умножения и деления сразу на две цифры неизвестно.
Для умножения или деления чисел в BCD-формате их необходимо либо преобразовать в двоичную форму и воспользоваться двоичной арифметикой, либо представить в ASCII-формате и воспользоваться десятичной арифметикой для этого формата.