
- •Архітектура і система команд мікропроцесорів
- •1. Архітектура еом
- •1. 1. Поняття про архітектуру еом
- •1.2. Програмна модель мікропроцесора Intel Pentium III
- •Сегментні регістри
- •Регістри стану і керування
- •1.4. Організація пам’яті
- •Сегментована модель пам’яті
- •Формування фізичного адреса в реальному режимі
- •Типи даних
- •Формат команд
- •Типи переривань
- •Структура програми на асемблері
- •Синтаксис асемблера
- •Директиви сегментації
- •Прості типи даних
- •Системи числення
- •Двійкова система числення
- •Шістнадцяткова система числення
- •Перевод із десяткової і шістнадцяткової системи у двійкову
- •Перевод із десяткової і двійкової у шістнадцяткову систему
- •Числа із знаком
- •Структура машинної команди
- •Способи задання операндів
- •Адресація пам’яті
- •Функціональна класифікація машинних команд
- •Команди обміну даними
- •Команди пересилання даних
- •Ввід-вивід в порт
- •Робота з адресами і вказівниками
- •Перетворення даних
- •Робота із стеком
- •Арифметичні цілочисельні команди
- •Цілі двійкові числа
- •Додавання двійкових чисел без знаку
- •Додавання двійкових чисел із знаком
- •Віднімання двійкових чисел без знаку
- •Віднімання двійкових чисел із знаком
- •Множення двійкових чисел без знаку
- •Множення двійкових чисел із знаком
- •Ділення двійкових чисел без знаку
- •Ділення двійкових чисел із знаком
- •Команди перетворення типів
- •4.2. Десяткові числа
- •Неупаковані bcd-числа
- •Упаковані bcd-числа
- •Логічні команди
- •Логічні команди
- •Команди зсуву
- •Лінійний зсув
- •Циклічний зсув
- •Додаткові команди зсуву
- •Команди передачі керування
- •Команди безумовного переходу;
- •Команди безумовного переходу
- •Процедури
- •Умовні переходи
- •Команда порівняння cmp
- •Команди умовного переходу і прапори
- •Команди умовного переходу і регістр ecxlcx
- •6.4. Організація циклів
- •Ланцюжкові команди
- •Пересилання ланцюжків
- •Порівняння ланцюжків
- •Сканування ланцюжків
- •Завантаження ланцюжків
- •Формування ланцюжків
- •Ввід-вивід елементів у порт
- •Складні структури даних
- •Доступ до елементів масиву
- •Двомірні масиви
- •8.2. Структури
- •Описання шаблона структури
- •Визначення даних з типом структури
- •Методи роботи із структурою
- •Об’єднання
- •Визначення екземпляру запису
- •Робота з записами
- •Макрозасоби мови асемблера
- •Макрокоманди
- •Макродирективи
- •Директиви while і rept
- •Директиви irp і irpc
- •Директиви умовної компіляції
- •Директиви компіляції по умові
- •Директиви if і ife
- •Директиви ifdef і ifndef
- •Директиви ifb і ifnb
- •Директиви ifidn, ifidni, ifdif і ifdifi
- •9.4. Директиви генерації помилок
- •%Out недопустиме ім’я регістра
Неупаковані bcd-числа
Корекція операції додавання двох BCD-чисел: aaa (ASCII Adjust for Addition)
aaa
Команда не має операндів і працює неявно з регістром al і аналізує значення його молодшої тетради. Якщо це значення менше 9, то прапор cf скидується в 0, і здійснюється перехід до наступної команди. Якщо це значення більше 9, то виконуються наступні дії:
o до вмісту молодшої тетради al (але не до всього регістра) добавляється 6, тим самим коректується десяткове значення у вірну сторону;
o прапор встановлюється в 1, тим самим фіксується перенос у старший розряд для того, щоб його можна було врахувати у наступних діях.
Корекція операції віднімання двох BCD-чисел: aas (ASCII Adjust for Substraction)
aas
Команда не має операндів і працює неявно з регістром al і аналізує значення його молодшої тетради. Якщо це значення менше 9, то прапор cf скидується в 0, і здійснюється перехід до наступної команди. Якщо це значення більше 9, то виконуються наступні дії:
o із вмісту молодшої тетради al (але не всього регістра) віднімається 6, тим самим коректується десяткове значення у вірну сторону;
o обнуляється старша тетрада регістра al;
o прапор встановлюється в 1, тим самим фіксується уявна позика із старшого розряду для того, щоб його можна було це врахувати у наступних діях.
Команда aas застосовується після команд sub, sbb.
Із прикладів додавання і віднімання неупакованих чисел видно, що нема стандартних алгоритмів для їх виконання. Програміст повинен сам реалізовувати ці операції. Це відноситься і до операцій множення і ділення. Є команди тільки для множення і ділення однорозрядних неупакованих чисел. Для множення чисел довільної розмірності необхідно реалізувати процес множення, наприклад в “стовпчик”
Для того, щоб перемножити два однорозрядних BCD-числа, необхідно:
o помістити один із співмножників у регістр al (як цього вимагає команда mul);
o помістити другий операнд у регістр або пам’ять (один байт);
o перемножити співмножники командою mul;
o отриманий результат скоректувати.
Для корекції результату після множення використовується команда aam (ASCII Adjust for Multiplication):
aam
Вона не має операндів і працює з регістром ax наступним чином:
o ділить al на 10;
o в результаті ділення частка записується в al, а залишок в ah.
Операція ділення двох неупакованих чисел має деяку відмінність. Тут також потрібно виконувати дії по корекції результату, але перед діленням. Попередньо в регістрі ax необхідно отримати дві неупаковані BCD-цифри діленого з допомогою команди aad (ASCII Adjust for Division):
aad
Команда не має операндів і перетворює двозначне BCD-число в регістрі ax у двійкове число. Це двійкове число буде грати роль діленого. Крім перетворення, команда aad поміщає отримане двійкове число в регістр al. Ділене буде звичайно двійковим числом в діапазоні 0-99. Алгоритм цих перетворень:
o помножити старшу цифру початкового BCD-числа в ax (вміст ah) на 10; o виконати додавання ah+al, результат (двійкове число) занести в al; o обнулити вміст ah.
Далі виконується звичайна команда div для ділення вмісту ax на одну BCD-цифру, що знаходиться у байтовому регістрі або пам’яті. Для ділення чисел більшої розрядності необхідно реалізовувати додатковий алгоритм.