
- •Архітектура і система команд мікропроцесорів
- •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 недопустиме ім’я регістра
Директиви сегментації
МП має шість сегментних регістрів через які він працює з одним сегментом коду, з одним сегментом стека, з одним сегментом даних і трьома додатковими сегментами даних. Для об’єднання програм на різних мовах призначені операнди в дерективі SEGMENT. Синтаксис: Ім’я_сегмента SEGMENT [Тип вирівнювання] [Тип комбінування] [Клас_сегмента] [Тип_розмірності_сегмента]
...
Ім’я_сегмента ENDS
Тип вирівнювання початку сегмента на заданій межі:
BYTE – без вирівнювання; Сегмент може починатися з любого адресу пам’яті.
WORD – сегмент починається по адресу кратному двом (один молодший біт фізичного адреса 0) (вирівнювання на межу слова);
DWORD – сегмент починається по адресу кратному чотирьом (два молодших біти фізичного адреса 0), (вирівнювання на межу подвійного слова);
PARA – сегмент починається по адресу кратному 16 (остання шістнадцяткова цифра 0h) (вирівнювання на межу параграфа);
PAGE – сегмент починається по адресу кратному 256 (дві останні шістнадцяткові цифри 00h) (вирівнювання на межу сторінки);
MEMPAGE – сегмент починається по адресу кратному 4 Кбайт (три останні шістнадцяткові цифри 000h) (вирівнювання на межу сторінки 4 Кбайт).
Тип комбінування сегментів різних модулів з одним іменем:
PRIVATE – сегмент не буде об’єднуватися з другими модулями з ти же іменем поза даним модулем;
PUBLIC – заставляє компонувач об’єднати всі сегменти з однаковим іменем; Новий об’єднаний сегмент буде цілим і неперервним. Всі адреси (зміщення) об’єктів (команд або даних) будуть обчислюватися відносно початку цього нового сегмента.
COMMON – розмістити всі сегменти з одним і тим же іменем по одному адресу; Всі сегменти з даним іменем будуть перекриватися і сумісно використовувати пам’ять. Розмір отриманого сегменту буде дорівнювати розміру самого більшого сегменту.
Atxxxx – розмістити сегмент по абсолютному адресу параграфа xxxx (наприклад доступ до відеопам’яті або області постійного запам’ятовуючого пристрою); Для доступа до сегмента необхідно в сегментний регістр занести значення заданого абсолютного адреса xxxx. Всі мітки і адреси відраховуються відносно заданого абсолютного адреса.
STACK – визначення сегментна стека. Заставляє компонував об’єднати всі однойменні сегменти і обчислити адреси в цих сегментах відносно регістр ss. Тип STACK аналогічний до типу PUBLIC, за винятком того, що регістра ss є стандартним сегментним регістром. Регіст sp встановлюється на кінець об’єднаного сегмента.
Клас сегмента – це строка в лапках, яка допомагає компоновану визначити відповідний порядок слідування сегментів при зборці програми із сегментів декількох модулів.
Тип розміру сегмента – задає розмір сегмента і порядок формування фізичного адресу. Для процесорів i80386 і вище сегменти можуть бути 16- і 32-розрядними. Це впливає на розмір сегмента і порядок формування фізичного адресу всередині нього. Можливі значення:
USE16 – 16-розрядна адресація. Фізичний адрес із 16-розрядним зміщенням.
Сегмент може містити до 64 Кбайт коду або даних;
USE32 – 32-розрядна адресація. Фізичний адрес із 32-розрядним зміщенням.
Сегмент може містити до 4 Гбайт коду або даних.
Всі сегменти рівноправні, так як директиви SEGMENT і ENDS не містять інформацію про функціональне призначення сегментів. Щоб повідомити транслятору, які сегменти відносяться до коду, даних або стека використовують директиву ASSUME. Ця директива повідомляє про прив’язку сегмента до сегментних регістрів. Синтаксис:
ASSUME: [nothing] [[cs:ім’я_сегмента], [nothing]] [[ds:ім’я_сегмента], [nothing]] [[ss:ім’я_сегмента], [nothing]] [[es:ім’я_сегмента], [nothing]] [[fs:ім’я_сегмента], [nothing]] [[gs:ім’я_сегмента], [nothing]]
Якщо в якості операнду використовується слово nothing, то попередні значення всіх шести регістрів анулюються. Якщо слово nothing використовується замість аргументу ім’я сегмента, то в цьому випадку вибірково розривається зв’язок між сегментом і відповідним регістром.
Для простих програм, які мають по одному сегменту коду, даних і стека використовують спрощені директиви вказання моделі пам’яті (MODEL) і сегментації. Синтаксис директиви модель:
MODEL [модифікатор] модель_пам’яті [ім’я_кодового_сегмента] [, [мова] [модифікатор_мови]] [,модифікатор]
Модифікатори моделі пам’яті:
o use16 – сегменти вибраної моделі використовуються як 16-бітні; o use32 – сегменти вибраної моделі використовуються як 32-бітні; o dos – програма для DOS.
Моделі пам’яті
Таблиця 2.1.
Модель |
Тип кода |
Тип даних |
Призначення моделі |
TINY |
near |
near |
Код і дані об’єднані в одну групу DGROUP, для створення |
|
|
|
програм формату .com |
SMALL |
near |
near |
Код займає один сегмент, дані об’єднані в одну групу DGROUP |
MEDIUM |
far |
near |
Код займає декілька сегментів, по одному на модуль; дані об’єднані в одну групу |
COMPACT |
near |
far |
Код в одному сегменті |
LARGE |
far |
far |
Код в декількох сегментах, по одному на модуль |
FLAT |
near |
near |
Код і дані в одному 32-бітному сегменті (плоска модель пам’яті) |
При використанні директиви MODEL транслятор робить доступними декілька ідентифікаторів, до яких можна звертатися під час роботи програми:
@code – фізичний адрес сегмента коду;
@data – фізичний адрес сегмента даних типу near
@fardata - фізичний адрес сегмента даних типу far
@fardata? - фізичний адрес сегмента неініціалізованих даних типу far
@stack - фізичний адрес сегмента стека.
Спрощені директиви вказання сегменту
Таблиця 2.2
-
Формат директиви
Призначення
Режим MASM
Режим IDEAL
.CODE [ім’я]
CODESEG [ім’я]
Початок або продовження сегментного коду
.DATA
DATASEG
Початок або продовження ініціалізованих даних. Також використовується для визначення даних типу near.
.CONST
CONST
Початок або продовження сегмента постійних даних (констант)
.DATA?
UDATASEG
Початок або продовження сегмента неініціалізованих даних. Також використовується для визначення даних типу near.
.STACK [розмір]
STACK [розмір]
Початок або продовження сегмента стека
.FARDATA [ім’я]
FARDATA [ім’я]
Початок або продовження сегмента ініціалізованих даних типа far.
.FARDATA? [ім’я]
UFARDATA? [ім’я]
Початок або продовження сегмента неініціалізованих даних типа far