Меню сайта

Урок 56. Десятичная коррекция

Те же самые команды, что и для чисел вдвоичном дополнительном
— — — коде, используются в программе для работыс числами в
— — — двоично=десятичном коде BCD. — Однако результат арифметических
— — — операций может оказаться неправильным длядвоично=десятичного
— — — представления. — Команды десятичной коррекции корректируют
— — — результат, полученный после действийдвоичной арифметики.

— — — — — Десятичная коррекция для сложения DAA идесятичная коррекция
— — — для вычитания DAS используются для работытолько с упакованными
— — — десятичными числами. В упакованномдесятичном числе каждый байт
— — — содержит две десятичные цифры. Команды DAAи DAS работают только с
— — — байтом данных, содержащимся в регистре AL.В связи с этими
— — — присущими командам ограничени- ями, ни уDAA, ни у DAS операндов
— — — нет.

— — — — — На Фиг. 4.12 показаны два примера. Впервом примере
— — — складываются два упакованных десятичныхчисла. Оба числа состоят из
— — — двух десятичных цифр, поэтому онипредставлены единственными
— — — байтами. В примере складываются эти числа,оставляя результат в
— — — регистре AL. Непосредственно за этимследует команда DAA, которая
— — — корректирует результат сложения,преобразуя его в упакованную
— — — десятичную форму. После команды DAA врегистре AL остается
— — — правильное упакованное десятичное число вдиапазоне 0 — 99. Если
— — — результат меньше 100, регистр содержитответ, а флаг переноса
— — — содержит 0. Если результат находится вдиапазоне 100 — 198, то в
— — — регистре AL остаются две младшиедесятичные цифры, а флаг переноса
— — — установлен равным 1, показывая, что былперенос.

— — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — 1/1/80 04:01:04
— — — — — — — — — -Фиг. 4.12 Пример двоично-десятичной арифметики — — — — — — — — Page — — — — — — -1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — PAGE — — -,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — TITLE — -Фиг. 4.12 Пример двоично-десятичной арифметики
— — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — CODE — — -SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ASSUME -CS:CODE,DS:CODE

— — — — — — — — — — -0000 — ?? — — — — — — — — — — — — -BCD1 — — — DB — — — — -? — — — — — — — Две десятичные цифрыупакованного числа
— — — — — — — — — — -0001 -?? — — — — — — — — — — — — -BCD2 — — -DB — — — — — ?

— — — — — — — — — — -0002 — ???? — — — — — — — — — — — BCD1L — — DW — — — — -? — — — — — — — Четыре десятичные цифрыупакованного числа
— — — — — — — — — — -0004 — ???? — — — — — — — — — — — BCD2L — — DW — — — — -?

— — — — — — — — — — -0006 — — — — — — — — — — — — — — — — — FIG4_12 PROC — — — NEAR

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —— -Сложение двух упакованных чисел

— — — — — — — — — — -0006 — — — — — — — — — — — — — — — — — DAA_EXAMPLE:
— — — — — — — — — — -0006 — A0 0000 R — — — — — — — — — — — — — — — — — — MOV — — — — AL, BCD1 -Взять первое упакованное число
— — — — — — — — — — -0009 — 02 06 0001 R — — — — — — — — — — — — — — -ADD — — — — AL, BCD2 — Добавитьвторое
— — — — — — — — — — -000D — 27 — — — — — — — — — — — — — — — — — — -DAA — — — — — — — — Преобразование упакованного числа
— — — — — — — — — — -000E — C3 — — — — — — — — — — — — — — — — — — -RET

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —— -Сложение двух упакованных чисел размером по 4 цифры (2 байта)

— — — — — — — — — — -000F — — — — —
— — — — — — — — — — — — DAA_LONG:
— — — — — — — — — — -000F — A0 0002 R — — — — — — — — — — — — — — — — — — MOV — — — — AL, BYTE PTRBCD1L
— — — — — — — — — — -0012 — 02 06 0004 R — — — — — — — — — — — — — — -ADD — — — — AL, BYTE PTR BCD2L — — — — — — Добавление младшей части числа
— — — — — — — — — — -0016 — 27 — — — — — — — — — — — — — — — — — — -DAA — — — — — — — — — — — — — — — — — — — — Коррекция упакованного числа
— — — — — — — — — — -0017 — A2 0004 R — — — — — — — — — — — — — — — — — — MOV — — — — BYTE PTRBCD2L, AL — — — — — — Сохранение младшейчасти
— — — — — — — — — — -001A — A0 0003 R — — — — — — — — — — — — — — — — — — MOV — — — -AL, BYTE PTR BCD1L+1

— — — — — — — — — — — Фиг. 4.12 Примеры вычислений с BCD(начало)
— — — — — — — — — — -001D — 12 06 0005 R — — — — — — — — — — — — — — -ADC — — — — AL, BYTE PTR BCD2L+1 — — — — Добавление старшей части числа
— — — — — — — — — — -0021 — 27 — — — — — — — — — — — — — — — — — — -DAA — — — — — — — — — — — — — — — — — — — — Коррекция упакованного числа
— — — — — — — — — — -0022 — A2 0005 R — — — — — — — — — — — — — — — — — — MOV — — — — BYTE PTRBCD2L+1, AL — — — — Сохранение старшейчасти
— — — — — — — — — — -0025 — C3 — — — — — — — — — — — — — — — — — — -RET

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —— -Сложение двух упакованных чисел

— — — — — — — — — — -0026 — — — — — — — — — — — — — — — — — DAS_EXAMPLE:
— — — — — — — — — — -0026 — A0 0000 R — — — — — — — — — — — — — — — — — — MOV — — — — AL, BCD1
— — — — — — — — — — -0029 — 2A 06 0001 R — — — — — — — — — — — — — — -SUB — — — — AL, BCD2 — — — — — — — — — — — — Вычитание значений
— — — — — — — — — — -002D — 2F — — — — — — — — — — — — — — — — — — -DAS — — — — — — — — — — — — — — — — — — — — Коррекция упакованного числа
— — — — — — — — — — -002E — C3 — — — — — — — — — — — — — — — — — — -RET

— — — — — — — — — — -002F — — — — — — — — — — — — — — — — — FIG4_12 ENDP

— — — — — — — — — — -002F — — — — — — — — — — — — — — — — — CODE — — -ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — END

— — — — — — — — — — — Фиг. 4.12 Примеры вычислений с BCD(продоложение)

— — — — — Команда DAA правильно устанавливаетрегистр флагов. Если в
— — — результате сложения получилось значение вдиапазоне 100 — 198, флаг
— — — переноса показывает перенос из старшейдесятичной позиции.
— — — Аналогично, нулевой результат оставляетустановленным в 1 флаг
— — — нуля. В случае операций с упакованнымидесятичными числами флаги
— — — знака и переполнения не имеют значения,хотя флаг знака
— — — устанавливается, если установлен старшийбит регистра AL. Команда
— — — DAA использует флаг дополнительногопереноса для определения вида
— — — коррекции, но после выполнения этойкоманды флаг дополнительного
— — -переноса неопределен.

— — — — — Второй пример на Фиг. 4.12 демонстрируетдесятичное сложение
— — — повышенной точности. Оно весьма похоже надвоичную арифметику с
— — — повышенной точностью, за исключением того,что после сложения
— — — каждого байта появляется команда DAA.Из=за ограничений, присущих
— — — команде DAA, в примере нельзя было сложитьдва упакованных
— — — десятичных слова, как слова, а затемприменить коррекцию. С
— — — упакованными десятичными числами разрешенатолько байтовая
— — — арифметика.

— — — — — Наконец, на Фиг. 4.12 показано, какиспользовать команду DAS.
— — — Это делается так же, как и при сложении,но команда DAS должна
— — — следовать за вычитанием. Здесь тожедопустимы только байтовые
— — — операции.

Категория: Программирование на Ассемблере | Дата: 09.02.13

Меню раздела
Блок