- •2. Структура регістра eflags
- •3. Організація оперативної пам’яті. Сегментована модель оперативної пам’яті. Формування адреси в реальному режимі
- •4. Формати і типи даних. Формат машинних команд. Система переривань
- •5. Десяткова арифметика. Форми зображення десяткових чисел
- •7. Ділення ascii-чисел.
- •6. Директиви сегментації. Директиви proc і endp
- •7. Опис простих типів мовою асемблера
- •10. Синтаксис команд мовою асемблера
- •11. Команди передач даних
- •Xchg ax, data1; (data2) в data1, (ax) – початковий стан
- •12. Стекові передачі даних
- •13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців
- •14. Команди передачі даних movXx. Команда setCc. Команда xlat
- •15. Команди додавання, віднімання і порівняння
- •Inc reg/mem; Розмір 8/16/32.
- •16. Команди множення і ділення
- •20. Команди логічних операцій. Команди зсувів
- •22. Команди операцій з двійковими ланцюжками
- •23. Команди передачі керування (безумовні переходи)
- •24. Команди умовних переходів і команди керування циклами
- •26. Команди переривань і повернення з переривань
- •Загальні поняття.
- •Використання префіксів в ланцюжкових командах.
- •Команда movs.
- •Команда cmps.
- •Команда scas.
- •Команда lods.
- •Команда stos.
- •Команди введення/виведення ланцюжків.
- •29. Команди керування процесором
- •Команди, які впливають на прапорці.
- •Команди синхронізації.
- •Системні команди
- •31. Формати даних, які підтримуються fpu
- •Параметри для трьох форматів в таблиці
- •32. Програмна модель fpu
- •33. Слово стану sw і слово керування cw пристрою fpu.
- •Відповідність між кодом умови і прапорцями
- •34. Команди передач даних fpu: завантаження, збереження, збереження з вибором зі стека, обміну, завантаження сталих.
- •35. Арифметичні команди fpu: додавання, віднімання, множення, ділення.
- •36. Додаткові арифметичні команди fpu.
- •37. Команди порівняння fpu
- •38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.
- •39. Команди керування пристроєм fpu
- •40. Спеціальні числові значення та особливі обчислювальні ситуації
5. Десяткова арифметика. Форми зображення десяткових чисел
Упакована (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=?.