Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 490; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.006 с.) |