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



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

– IMUL <операнд_1>[, операнд_2, операнд_3]; умножение чисел со знаком.

Эта команда имеет три формы, различающиеся числом операндов:

1) IMUL <операнд_1>: операнд_1 (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX:AX или EDX:EAX соответственно.

2) IMUL <операнд_1>,<операнд_2>: операнд_2 (число, регистр или переменная) умножается на операнд_1 (регистр), и результат заносится в операнд_1.

3) IMUL <операнд_1>,<операнд_2>,<операнд_3>: операнд_2 (регистр или переменная) умножается на операнд_3 (число), и результат заносится в операнд_1 (регистр).

Произведение имеет двойной размер

В первом случае приемник (регистры АХ, DX:AX или EDX:EAX) всегда больше операнд_1.

Если результат мал и умещается в одном регистре (то есть если cf=of=0), то содержимое другого регистра (старшей части) является расширением знака – все его биты равны старшему биту (знаковому разряду) младшей части результата.

В противном случае (если cf=of=1) знаком результата является знаковый бит старшей части результата, а знаковый бит младшей части является значащим битом двоичного кода результата.

 

Пример: mul bl;al*bl, результат в Ах.

Пример: mul bx;ax*bx, результат Dx:Ax.

 


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

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

– 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.

Источник может быть:

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

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

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

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

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

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

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

3) делитель равен 0;

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

– при делении слова на байт значение делимого в более чем 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.

 


Лекция №4. Арифметические операции над двоично-десятичными числами **********************

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

Неупакованные 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. В десятичном представлении это 13.

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

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

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

3) к содержимому младшей тетрады al прибавляется 6, тем самым значение десятичного результата корректируется в правильную сторону;

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

Например при суммировании 06+07 в al находится 0000 1101. После команды ааа в регистре будет 1101+0110=0011, то есть двоичное 0000 00112 =310, а флаг cf установится в 1, то есть запомнится перенос в старший разряд. Далее необходимо использовать команду сложения adc, которая учтёт перенос из предыдущего разряда.

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

 

Строки 14 и 15 складывают цифры в очередных разрядах BCD-чисел, при этом учитывается возможный перенос из младшего разряда. Команда ааа корректирует результат сложения, формируя в аl BCD-число и, при необходимости, устанавливая в 1 флаг cf. Строка 20 учитывает возможность переноса при сложении цифр из самых старших разрядов чисел. Результат сложения формируется в поле sum.

 



Поделиться:


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

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