
- •Архітектура і система команд мікропроцесорів
- •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 недопустиме ім’я регістра
Робота із стеком
Стек – це область пам’яті (в сегменті стека), виділена для тимчасового зберігання даних.
Для роботи із стеком призначені три регістри:
o ss – сегментний регістр стека;
o esp/sp – регістр вказівника стека (зміщення вершини стека);
o ebp/bp – регістр вказівника бази (кадра) стека (зміщення дна стека).
Розмір стека залежить від режиму роботи МП і обмежується 64 Кбайт для реального режиму (4 Гбайт для захищеного режиму). У кожний момент часу доступний один (поточний) стек, адрес сегменту якого знаходиться в регістрі ss. Для звернення до другого стеку необхідно завантажити у ss другий адрес.
Особливості роботи із стеком:
запис і читання здійснюється за принципом LIFO (last in first out) – “останній прийшов, перший пішов”;
стек росте в сторону молодших адресів (зменшення);
при використанні регістрів esp/sp і ebp/bp вважається, що їх вміст являє зміщення відносно сегментного регістра ss.
Початок стека розмішений у старших адресах і має значення ss:ffff (для реального режиму
64 Кбайт = 0ffffh).
Для роботи із стеком існують команди запису і читання. Команди запису:
push джерело – запис значення джерело у вершину стека;
pusha – запис регістрів ax, cx, dx, bx, sp, bp, si, di (значення sp до видачі команди pusha) для атрибута розрядності use16 і регістрів eax, ecx, edx, ebx, esp, ebp, esi, edi – для use32;
pushaw- запис регістрів ax, cx, dx, bx, sp, bp, si, di (нечутлива до атрибути розрядності:
use16, use32).
Алгоритм роботи команди push:
(sp) = (sp) – 2 ; значення sp зменшується на 2
значення із джерела записується по адресу ss:sp.
Команди читання виконують дії обернені до команд запису:
pop приймач – читання (“знімання”) з вершини стека і запис в операнд приймач;
popa, popaw.
Алгоритм роботи команди pop:
вміст вершини стека записується в операнд приймач;
(sp) = (sp) + 2; значення sp збільшується на 2.
Команди для зберігання в стеку регістра прапорів:
pushf – зберегти регістр прапорів у стеку (для атрибуту розрядності use16 записується
flags, а для use32 – eflags);
pushfw – завжди працює як з атрибутом use16;
popf, popfw - виконують дії обернені до команд запису.
Стек використовується при:
викликах підпрограм;
тимчасовому зберіганні значень регістрів;
визначенні локальних змінних.
Арифметичні цілочисельні команди
Арифметичні цілочисельні команди працюють із двома типами чисел:
цілі двійкові (із знаком, без знаку);
цілі десяткові.
Класифікація арифметичних команд:
Рис.4.1. Класифікація арифметичних команд
Цілі двійкові числа
Ціле двійкове число з фіксованою крапкою – це число закодоване у двійковій системі числення. Розмірність двійкового числа складає 8, 16, 32-біти. Описуються директивами db, dw, dd. Знак двійкового числа визначається тим, як інтерпретується 7-й, 15-й, 31-й байт. Є тільки дві команди які враховують знак – imul, idiv.
Додавання двійкових чисел без знаку
Додавання виконується по правилах додавання двійкових чисел. Для фіксування ситуації виходу за розрядну сітку результату, призначений прапор переносу cf. Програміст повинен передбачити таку ситуацію і засоби її коректування (звичайно команда умовного переходу jc). Є три команди додавання:
inc операнд – збільшення операнду на 1;
add операнд_1, операнд_2 – принцип дії операнд_1=операнд_1+операнд_2;
adc операнд_1, операнд_2 – команда додавання з врахуванням прапору переносу cf.
Принцип дії операнд_1 = операнд_1 + операнд_2 + cf;