Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Десяткова арифметика. Форми зображення десяткових чисел
Упакована (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 с.) |