Вычитание двоичных чисел без знака 


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



ЗНАЕТЕ ЛИ ВЫ?

Вычитание двоичных чисел без знака



Команды вычитания выполняют вычитание, по рассмотренным алгоритмам, а учёт особых ситуаций должен производиться самим разработчиком программного продукта.

К командам вычитания относят:

– DEC <операнд> – операция декремента. Флаг CF не затрагивается, а остальные арифметические флаги (OF, SF, ZF, AF, PF) устанавливаются в соответствии с результатом вычитания.

– SUB <операнд_1>,<операнд_2> – команда вычитания;

Принцип действия:

операнд_1=операнд_1-операнд_2.

Нельзя использовать переменную одновременно и для операнд_2, и для операнд_1. Команда SUB не делает различий между числами со знаком и без знака.

– SBB <операнд_1>,<операнд_2> – команда вычитания с учётом заёма (флага cf).

Принцип действия:

операнд_1=операнд_1-операнд_2-значение_cf.

 

Пример: вычтем из одного 64-битного числа, хранящегося в EDX:EAX другое, хранящееся в ЕВХ:ЕСХ.

Sub eax,ecx

Sbb edx,ebx

Если при вычитании младших двойных слов произошел заем, то он будет учтен при вычитании старших.

Пример: в регистр al поместить результат вычитания 5-10.

0000 0101 - 0000 1010 ----------------- 1111 1011=FFFBh (0-1111 1011) 1 0000 0000 - 1111 1011 = 0000 0101(neg)

Факт того, что в al записано отрицательное число, отражён в состоянии флага cf.

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

Вычитание в микропроцессоре производится путём сложения. Результат вычитания нужно рассматривать как значение в дополнительном коде. Например:

-45-45=-90

-45= 11010011

+

-45= 11010011

=

-90=1 10100110 в приёмнике число в дополнительном коде. (sf=1; of=1;)

+00000001

=010110102 =9010

 


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

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

MUL <источник>;

Выполняет умножение содержимого источника (регистр или переменная) и регистра AL, АХ, ЕАХ (в зависимости от размера источника) и помещает результат в АХ, DX:AX, EDX:EAX соответственно. Произведение имеет двойной размер.

 

Размер Источник Результат (приёмник)

 

Если АН, DX, EDX содержит только нули, то флаги CF=0 и OF=0, иначе — в 1.

Например, умножим содержимое регистра al (25) на 45.

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

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

 


Лекция №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 раз больше значения делителя.

Пример:



Поделиться:


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

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