На главную Назад
Добро пожаловать, уважаемый посетитель!

Те же самые команды, что и для чисел в двоичном дополнительном

коде, используются в программе для работы с числами в

двоично=десятичном коде 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.001/1/80 04:01:04

Фиг. 4.12 Пример двоично-десятичной арифметикиPage1-1

 

 

PAGE,132

TITLEФиг. 4.12 Пример двоично-десятичной арифметики

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

 

0000?? BCD1DB?; Две десятичные цифры упакованного числа

0001?? BCD2DB?

 

0002????BCD1LDW?; Четыре десятичные цифры упакованного числа

0004????BCD2LDW?

 

0006FIG4_12 PROCNEAR

 

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

 

0006DAA_EXAMPLE:

0006A0 0000 RMOVAL, BCD1 ; Взять первое упакованное число

000902 06 0001 RADDAL, BCD2 ; Добавить второе

000D27 DAA; Преобразование упакованного числа

000EC3 RET

 

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

 

000FDAA_LONG:

000FA0 0002 RMOVAL, BYTE PTR BCD1L

001202 06 0004 RADDAL, BYTE PTR BCD2L; Добавление младшей части числа

001627 DAA; Коррекция упакованного числа

0017A2 0004 RMOVBYTE PTR BCD2L, AL; Сохранение младшей части

001AA0 0003 RMOVAL, BYTE PTR BCD1L+1

 

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

001D12 06 0005 RADCAL, BYTE PTR BCD2L+1; Добавление старшей части числа

002127 DAA; Коррекция упакованного числа

0022A2 0005 RMOVBYTE PTR BCD2L+1, AL; Сохранение старшей части

0025C3 RET

 

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

 

0026DAS_EXAMPLE:

0026A0 0000 RMOVAL, BCD1

00292A 06 0001 RSUBAL, BCD2; Вычитание значений

002D2F DAS; Коррекция упакованного числа

002EC3 RET

 

002FFIG4_12 ENDP

 

002FCODEENDS

END

 

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

 

Команда DAA правильно устанавливает регистр флагов. Если в

результате сложения получилось значение в диапазоне 100 - 198, флаг

переноса показывает перенос из старшей десятичной позиции.

Аналогично, нулевой результат оставляет установленным в 1 флаг

нуля. В случае операций с упакованными десятичными числами флаги

знака и переполнения не имеют значения, хотя флаг знака

устанавливается, если установлен старший бит регистра AL. Команда

DAA использует флаг дополнительного переноса для определения вида

коррекции, но после выполнения этой команды флаг дополнительного

переноса неопределен.

 

Второй пример на Фиг. 4.12 демонстрирует десятичное сложение

повышенной точности. Оно весьма похоже на двоичную арифметику с

повышенной точностью, за исключением того, что после сложения

каждого байта появляется команда DAA. Из=за ограничений, присущих

команде DAA, в примере нельзя было сложить два упакованных

десятичных слова, как слова, а затем применить коррекцию. С

упакованными десятичными числами разрешена только байтовая

арифметика.

 

Наконец, на Фиг. 4.12 показано, как использовать команду DAS.

Это делается так же, как и при сложении, но команда DAS должна

следовать за вычитанием. Здесь тоже допустимы только байтовые

операции.


 

Mail.ru