- •Архітектура і система команд мікропроцесорів
- •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 недопустиме ім’я регістра
Додавання двійкових чисел із знаком
Команди додавання чисел із знаком, такіж як і без знаку. Додаткові числа подаються у двійковому коді, а від’ємні – у додатковому. При додаванні таких чисел можлива ситуація переповнення (встановлення прапора of в 1) при переносі:
o із 14-го розряду (для позитивних);
o із 15-го розряду (для негативних).
Віднімання двійкових чисел без знаку
Після команд віднімання чисел без знаку необхідно аналізувати стан прапору cf. Якщо він встановлений в 1, то це говорить про те, що є позика із старшого розряду, і результат отриманий у додатковому коді. Врахування таких ситуацій повинен виконувати програміст. До команд віднімання відносяться:
o dec операнд – зменшення операнда на 1;
o sub операнд_1, операнд_2 – команда віднімання, що працює по принципу операнд_1=операнд_1-операнд_2;
o sbb операнд_1, операнд_2 – команда віднімання з врахуванням позики (прапор cf):
операнд_1=операнд_1-операнд_2 – значення_cf.
Для перетворення результату у додатковому коді до нормального виду використовується команда neg.
Віднімання двійкових чисел із знаком
При відніманні двійкових чисел із знаком може виникнути переповнення мантиси, коли розряд із значенням міняє значення знакового розряду. Визначити таку ситуацію можна по вмісту прапора переповнення of. Його встановлення в 1 говорить про те, що результат вийшов за діапазон знакових чисел для операнду даного розміру, і програміст повинен скоректувати результат.
Множення двійкових чисел без знаку
Для множення двійкових чисел без знаку використовується команда
mul операнд_1
Другий співмножник операнд_2 заданий неявно і його розміщення показано в таблиці 4.1.
Таблиця 4.1
Розміщення операндів і результата при множенні
Співмножник_1 |
Співмножник_2 |
Результат |
Байт |
al |
16 біт в ах: al-молодша частина, ah-старша частина результата |
Слово |
ax |
32 біти в парі dx:ax: ax-молодша частина, dx-старша частина результата |
Подвійне слово |
eax |
64 біти в парі edx:eax: eax-молодша частина, edx-старша частина результата |
Щоб взнати, чи результат помістився в одному операнді використовують прапори переносу cf і переповнення of:
o якщо старша частина нульова, то після операції добутку прапори cf=0 і of=0;
o якщо ж ці прапори ненульові, то це значить, що результат вийшов за межі молодшої частини добутку і складається із двох частин, що і потрібно врахувати при подальшій роботі.
Множення двійкових чисел із знаком
Множення чисел із знаком:
imul операнд_1
Команда виконується аналогічно команді mul. Якщо результат поміщається в одному регістрі (тобто cf=of=0), то вміст другого регістру є розширення знаку. У протилежному випадку (cf=of=1), знаком результат є знаковий біт старшої частини результату.
Ділення двійкових чисел без знаку
Ділення чисел без знаку:
div дільник
Місцезнаходження діленого наведено в табл. 4.2.
Розміщення операндів і результату при діленні
Таблиця 4.2
Ділене |
Дільник |
Частка |
Залишок |
Слово 16 біт в рег. ах |
Байт-регістр або комірка |
Бай в регістрі al |
Байт в регістрі ah |
32 біт dx-старша частини ax-молодша частина |
16 біт регістр або комірка пам’яті |
Слово 16 біт в регістрі ax |
Слово 16 біт в регістрі dx |
64 біт edx-старша частини eax-молодша частина |
Подвійне слово 32 біт регістр або комірка пам’яті |
Подвійне слово 32 біти в регістрі eax |
Подвійне слово 32 біт в регістрі edx |
Під час виконання роботи може виникнути виняткова ситуація “ділення на нуль”, що викликана однією із причин:
o дільник дорівнює нулю;
o частка не входить у відведену розрядну сітку:
o ділене і дільник величиною в байт, а значення діленого більш як в 256 разів більше значення дільника;
o ділене і дільник величиною в подвійне слово, а значення діленого більш як в 65536
разів більше значення дільника;
o ділене і дільник величиною в чотирикратне слово, а значення діленого більш як в
4294967296 разів більше значення дільника.
