Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

DIV BX ; Dx:Ax/Bx, результат Ax,Dx.

Поиск

DIV MEM_BYTE; AX/MEM_byte, результат Al,Ah

 

Пример1: необходимо выполнить деление 514/2, D=2d=2h, C=514d=202h.

.data

C dw 514

D db 2

.code

НЕПРАВИЛЬНО!!!
mov ax,C

mov bl,D

div bl; Ax/Bl; 10 0000 0010/10; 2d*256d=512d<=514d

 

2*256=512<514

 

Пример2: необходимо выполнить деление 2 293 830/35, D=35d=23h, C=2293830d=0023 0046h.

.data

C dd 2 293 830; 00230046h

D dw 35; 0023h

.code

НЕПРАВИЛЬНО!!!
mov eax, C; ax=0046h

НЕПРАВИЛЬНО!!!
mov dx, word ptr [C+2]; dx=0023h

mov bx,D

div bx; Dx:Ax/Bx=00230046h/0023h; 35d*65536d=2 293 760d<2 293 830d

 

35*65536=2 293 760<2 293 830

 

 


Деление двоичных чисел со знаком

Для деления чисел со знаком предназначена команда:

– IDIV <делитель>;

 

Команда выполняет целочисленное деление со знаком АХ, DX:AX или EDX:ЕАХ (в зависимости от размера делителя) на делитель (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток — в АН, DX или EDX соответственно.

 

Для этой команды верно всё то же, что и для команды DIV.

 


Арифметические операции над двоично-десятичными числами (BCD числами)

В приложениях, в которых числа должны быть большими и точными необходимо использовать BCD –числа. Отдельных команд сложения, вычитания, умножения и деления BCD-чисел нет. Складывать и вычитать можно BCD-числа как в упакованном формате, так и в неупакованном, а делить и умножать можно только неупакованные BCD-числа.

Микропроцессор хранит BCD-числа в двух форматах (рис. 1):

– упакованный формат – каждый байт содержит две десятичные цифры. Десятичная цифра представляет собой двоичное значение в 4 бита. Диапазон представления десятичного упакованного числа в одном байте составляет от 0 до 99;

– неупакованный формат – каждый байт содержит одну десятичную цифру в четырёх младших битах. Старшие четыре бита имеют нулевое значение и называются зоной. Диапазон представления десятичного неупакованного числа в одном байте составляет от 0 до 9.

Рис. 1. Представление BCD- чисел.

 

Для того, чтобы описать BCD- числа в программе необходимо использовать директивы описания и инициализации данных – db и dt. К примеру (dt - 10 байт):

.data

Per_1 db 2,3,4,5,6,8,2;02 03 04 05 06 08 02

Per_2 dt 9875645; 00 00 00 00 00 00 98 75 64 05


Неупакованные BCD-числа

Пример1: Результат сложения не больше 9. 6+3

6=0000 0110

+

3=0000 0011

=

9=0000 1001 – результат правильный.

Пример2: Результат сложения больше 9.

06=0000 0110

+

07=0000 0111

=

13=0000 1101 – результат неправильный.

Правильный результат в неупакованном BCD-формате:

0000 0001 0000 0011

1 3

 

Пример описания BCD-чисел:

Oper_1 DB '295';BCD-число 592 в ASCII- формате

Oper_2 DB 2,9,5;BCD-число 592 в неупакованном формате

Oper_3 DB 2h,59h;Упакованное BCD-число 5902

Oper_4 DT 592;Упакованное BCD- число 00 00 00 00 00 00 00 00 59 02, занимающее 10 байт в памяти (старший байт отведён для кодирования знака: 80h (1000 0000b)- отрицательное число, 00h- положительное).

 


Для коррекции операции сложения двух однозначных неупакованных BCD-чисел в системе команд микропроцессора существует специальная команда:

ААА; ASCII-коррекция после сложения для представления в символьном виде.

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

1) к содержимому младшей тетрады al прибавляется 6;

Флаг 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;



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 396; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.137.13 (0.005 с.)