Десяткова арифметика. Форми зображення десяткових чисел 


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



ЗНАЕТЕ ЛИ ВЫ?

Десяткова арифметика. Форми зображення десяткових чисел



Упакована (BCD) – форма: в одному байті знаходяться двійкові коди десяткових цифр – один в старшій та один в молодшій тетрадах.

Не упакована (ASCII) – форма: в старшій тетраді або 0011b, або 0000b, а в молодшій тетраді двійковий код десяткової цифри.

В обох формах багато розрядні десяткові цифри подаються наборами байтів і розглядаються як числа без знаку.

Потрібно відзначити, що в системі машинних команд є засоби для роботи тільки з операндами довжиною один байт. Основним робочим регістром у всіх десяткових операціях є регістр al.

Додавання BCD-чисел.

Щоб додати два одно байтових упакованих числа, потрібно виконати дві дії. Спочатку ці два числа сумуються як звичайні двійкові числа за правилами двійкової арифметики, а потім здійснюється корекція результату. Неправильний результат може появитися в двох випадках:

одержана неприпустима тетрада (результат більший 9);

одержана припустима тетрада, але при додаванні виникло двійкове перенесення з вагою 16, у той час як правильна вага перенесення 10.

Перенесення з молодшої тетради фіксується прапорцем af, а зі старшої – прапорцем cf.

Корекцію двійкової суми BCD-чисел, одержаної за допомогою команд add або adc, якщо вона знаходиться в регістрі al, здійснюють командою daa.

Алгоритм корекції:

2.1. Якщо af=1 або молодша тетрада регістра al містить заборонену комбінацію, то до вмісту регістра al додається 06h і прапорець af установлюється рівним 1;

2.2. Якщо сf=1 або старша тетрада регістра al містить заборонену комбінацію, то до вмісту регістра al додається 60h і прапорець сf установлюється рівним 1.

Команда daa діє на всі прапорці, за винятком прапорця переповнення of, стан якого після виконання команди – не визначений.

(al)=25; (bl)=68; add al,bl; (al)=93; sf=af=pf=1; zf=cf=0; of=?.

Віднімання BCD-чисел.

Вважатимемо, що зменшуване знаходиться в регістрі al, а від’ємник у будь-якому одно байтовому загальному регістрі або оперативній пам’яті розміром один байт. Щоб відняти два одно байтових упакованих числа, потрібно виконати дві дії:

1) операнди віднімаються як двійкові числа за допомогою команди sub або sbb так, щоб результат виявився в регістрі al;

2) результат коректується командою das – десяткової корекції після віднімання.

Дія команди das:

3.1. Якщо af=1 або молодша тетрада регістра al містить заборонену комбінацію, то від вмісту регістра al віднімається 06h і прапорець af установлюється рівним 1;

3.2. Якщо сf=1 або старша тетрада регістра al містить заборонену комбінацію, то від вмісту регістра al віднімається 60h і прапорець сf установлюється рівним 1.

Команда das модифікує прапорці як і команда daa.

Оскільки віднімання операндів виконується за алгоритмом додавання зменшуваного з доповняльним кодом від’ємника, то прапорці af і cf в операції віднімання інтерпретуються як прапорці позичання і встановлюються рівними 1 у випадку, коли відповідні перенесення при додаванні зменшуваного і доповняльного коду від’ємника не виникають.

Нехай (al)=10000110b, (ah)=00000111b. За допомогою команди sub al,ah одержимо

10000110b+11111001b=01111111b – зменшуване плюс доповняльний код від’ємника = неправильний результат; cf=0; af=1.

Корекція за командою das:

01111111b–00000110b=01111001b – правильний BCD-результат; sf=0; zf=0; af=1; pf=0; cf=0; of=?.

Відзначимо також, що в разі одержання від’ємної різниці вона подається в десятковому доповняльному коді.

Додавання ASCII-чисел.

Алгоритм додавання таких чисел можна сформулювати так:

1). Одно байтові операнди додаються як двійкові числа командою add або командою adc з одержанням проміжного результату в регістрі al;

2). Корекція результату для додавання ASCII-чисел за допомогою команди aaa, дії якої побудовані з урахуванням реалізації операцій з багато розрядними числами.

Корекція результату додавання складається з наступних кроків:

4.1. Якщо молодша тетрада регістра al містить припустиме десяткове значення і af=0, то перейти до кроку 4.3.

4.2. Якщо молодша тетрада містить заборонену комбінацію або af=1, то необхідно додати 06h до вмісту al, додати 1 до вмісту ah і встановити af рівним 1;

4.3. Встановити старшу тетраду регістра al рівну нулеві;

4.4. Встановити прапорець cf у той же стан, в якому знаходиться прапорець af.

Команда aaa – одно байтова, діє тільки на прапорці af і cf, стани інших прапорців після її виконання – не визначені.

Нехай в регістрах (ax)=0535; (bl)=39. Виконуються команди:

add al,bl

aaa; (ax)=0604; af=1; cf=1.

Віднімання ASCII-чисел.

Алгоритм віднімання таких чисел можна сформулювати так:

1). Одно байтові операнди віднімаються як двійкові числа командою sub або командою sbb з одержанням проміжного результату в регістрі al;

2). Корекція результату для віднімання ASCII-чисел за допомогою команди aas, дії якої побудовані з урахуванням реалізації операцій з багато розрядними числами.

Корекція результату віднімання складається з наступних кроків:

5.1. Якщо молодша тетрада регістра al містить припустиме десяткове значення і af=0, то перейти до кроку 5.3.

5.2. Якщо молодша тетрада містить заборонену комбінацію або af=1, то необхідно відняти 06h від вмісту al, відняти 1 від вмісту ah і встановити af рівним 1;

5.3. Встановити старшу тетраду регістра al рівну нулеві;

5.4. Встановити прапорець cf у той же стан, в якому знаходиться прапорець af.

Команда aas – одно байтова, діє тільки на прапорці af і cf, стани інших прапорців після її виконання – не визначені.

Нехай в регістрах (ax)=0438. Виконуються команди:

add al,35h

aas; (ax)=0403h; af=0; cf=0.

Множення ASCII-чисел.

Команди десяткової корекції для множення і ділення BCD-чисел в мікропроцесорі i486 і наступних моделях цього мікропроцесора відсутні, але якщо використати не упаковану форму або спеціально їх розпакувати, то можна виконувати в мікропроцесорі операції множення і ділення за правилами десяткової арифметики.

Сформулюємо алгоритм множення.

1). Множення одно байтових співмножників, в яких молодші тетради містять двійкові коди десяткових цифр, а старші тетради нульові, за допомогою команди mul. Ця команда формує в регістрі al двійковий добуток;

2). Корекція одержаного результату командою aam, яка перетворює вміст регістра al у дво цифровий добуток: старша цифра в регістрі ah, а молодша в регістрі al, причому молодші тетради містять двійкові коди десяткових цифр, а старші тетради – нульові.

Команда aam ділить вміст регістра al на 10 (0ah) і частку завантажує в регістр ah, а остачу – в регістр al. Стани прапорців sf, zf, pf залежать від вмісту регістра al, а прапорців of, af, cf – не визначені.

(al)=07; (bl)=09;

mul bl;

aam; (ax)=0603; sf=0; zf=0; pf=1; 0f=?; af=?; cf=?.

Ділення ASCII-чисел.

Ділення не упакованих чисел відрізняється від попередніх операцій тим, що необхідна корекція відбувається до операції власне ділення. В дво байтові команді корекції для ділення aad припускається, що в регістрах ah і al знаходиться відповідне дво розрядне ділене, причому ah містить розряд десятків, а регістр al – розряд одиниць, а обидві старші тетради нульові.

1). Спочатку виконується команда aad, яка підготує потрібний дільник в регістрі ax;

2). За нею ділення вмісту регістра ax на одно розрядний дільник можна одержати за допомогою команди div.

Дво байтова команда aad виконує такі дії:

7.1. Вміст регістра ah множиться на 10 (0ah);

7.2. Одержаний результат додається до вмісту регістра al;

7.3. Вміст регістра ah стає рівним нулеві;

7.4. Стани прапорців sf, zf, pf визначаються за результатом в регістрі al, а стани прапорців of, af, cf не визначені.

(ax)=0604; aad; (ax)=0040h; sf=0; zf=0; pf=0; of=?; af=?; cf=?.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 375; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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