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

Лекция №5. Арифметические команды над целыми числами (продолжение). Арифметические операции над двоично-десятичными числами (bcd числами)

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

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

DIV <делитель> ;

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

Расположение операндов и результата при делении

размер делителя

деление

частное в...

остаток в...

BYTE (8-bits)

ax / делитель

AL

AH

WORD (16-bits)

dx:ax* / делитель

AX

DX

DWORD (32-bits)

edx:eax* / делитель

EAX

EDX

Пример: div bl ;ax/bl, результат в Al,Ah.

Пример: div bx ; (Dx:Ax)/Bx, результат Ax,Dx.

Источник (делитель) может быть:

  1. 8-бит регистр (al, ah, cl,...)

  2. 16-бит регистр (ax, dx, ...)

  3. 32-бит регистр (eax, edx, ecx...)

  4. 8-бит значение из памяти (byte ptr [xxxx])

  5. 16-бит значение из памяти (word ptr [xxxx])

  6. 32-бит значение памяти (dword ptr [xxxx])

Прерывание 0 – «деление на 0» – при выполнении команды div может возникнуть по одной из следующих причин:

  1. делитель равен 0;

  2. частное не входит в отведённую под него разрядную сетку, что может случиться в следующих случаях:

– при делении слова на байт значение делимого в более чем 256 раз больше значения делителя;

– при делении двойного слова на слово делимое в более чем 65536 раз больше значения делителя;

– при делении учетверённого слова на двойное слово делимое в более чем 4 294 967 296 раз больше значения делителя.

Пример:

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, то выполняются следующие действия: