Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать
  1. К содержимому младшей тетрады al прибавляется 6;

  2. Флаг cf устанавливается в 1, тем самым фиксируется перенос в старший разряд для того, чтобы его можно было учесть в последующих действиях.

Пример 1: просуммировать 06+07.

0000 0110

+ (add)

0000 0111

=

al= 0000 1101

После команды ааа:

  1. к результату прибавляется 6d

0000 1101b

+

0000 0110b

=

0000 0011b, то есть al=0000 00112 =310

2) флаг cf установится в 1, то есть запомнится перенос в старший разряд

3) чтобы учесть перенос из предыдущего разряда необходимо использовать команду сложения adc.

Пример: сложим два неупакованных BCD-числа 71+54=125

1) al=1d+4d+cf=0000 0101b;

не прибавляем 6;

(al=0000 0101; cf=0)

2) al=7d+5d=0000 1100b;

0000 1100+0000 0110=0000 0010b

(al=0000 0010; cf=1)

Вычитание неупакованных BCD-чисел

Пример1.

6=0000 0110

-

4=0000 0100

=

2=0000 0010 – результат верный

Пример2.

6=0000 0110

-

7=0000 0111

=

-1=1111 1111 – результат неверный.

Правильный результат должен быть 0000 10012 =910 . При этом предполагается заём из старшего разряда, то есть cf=1. Для корректировки результата существует команда:

AAS – коррекция результата вычитания для представления в символьном виде.

Команда работает с регистром al, анализируя его младшую тетраду: если её значение меньше 9, то флаг cf сбрасывается в 0, и управление передаётся следующей команде. Если значение тетрады в al больше 9, то команда aas выполняет следующие действия:

  1. Из содержимого младшей тетрады регистра al вычитается 6;

  2. Обнуляется старшая тетраду регистра al;

  3. Устанавливает флаг cf в 1, фиксируя воображаемый заём из старшего разряда.

Команда aas применяется вместе с основными командами вычитания sub и sbb.

В ассемблере отсутствует также формальное правило введения знака для неупакованных BCD- чисел. Решение этого вопроса остаётся за программистом. Как один из возможных можно принять принцип кодирования знака для упакованных чисел, который реализуется директивой DT. Например, число -386 (младший байт по старшему адресу) инициализируем следующим образом:

Oper DB 80h,6,8,3 ;Неупакованное BCD- число -386

Например: 2-7

.data

a db 02h

b db 07h

.code

xor ax,ax ; очистка ах

xor bx,bx ; очистка bx

mov al,a ; в al занесли 1

sbb al,b ; al=2-7 ; 0000 0010-0000 0111-0=1111 1011

aas ; 1011-0110=0101, al=0000 0101, cf=1

Умножение

Для того, чтобы перемножить два одноразрядных BCD –числа необходимо:

  1. поместить один из сомножителей в регистр al (этого требует команда mul);

  2. поместить второй операнд в регистр или память, отведя байт;

  3. перемножить сомножители командой mul (результат будет в ах);

  4. результат получится в двоичном коде и его нужно корректировать.

Для коррекции результата после умножения применяется команда:

AAM – коррекция результата умножения для представления в символьном виде.

Команда не имеет операндов и работает с регистром ах следующим образом: