
- •Архітектура і система команд мікропроцесорів
- •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 недопустиме ім’я регістра
Додаткові команди зсуву
Команди зсуву подвійної точності:
shld операнд_1, операнд_2, лічильник_зсувів – зсув вліво подвійної точності. Команда shld робить заміну шляхом зсуву бітів операнда операнд_1 вліво, заповнюючи його біти справа, бітами, що витісняються з операнда_2. Кількість зсовуваних бітів визначається визначається значенням лічильник_зсувів, яке лежить в діапазоні 0...31. Це значення може задаватися безпосередньо операндом або міститися в регістрі cl. Значення операнд_2 не змінюється.
shrd операнд_1, операнд_2, лічильник_зсувів – зсув вправо подвійної точності. Команда shrd робить заміну шляхом зсуву бітів операнда операнд_1 вправо, заповнюючи його біти зліва, бітами, що витісняються з операнда_2. Кількість зсовуваних бітів визначається визначається значенням лічильник_зсувів, яке лежить в діапазоні 0...31. Це значення може задаватися безпосередньо операндом або міститися в регістрі cl. Значення операнд_2 не змінюється.
Рис. 5.6. Схема роботи команд shld, shrd
Команди передачі керування
Програма являє собою послідовність команд і даних, що займають певний простір оперативної пам’яті. То яка команда повинна виконуватися наступною, МП взнає по вмісту пари регістрів cs:(e)ip:
cs – сегментний регістр кода, в якому знаходиться фізичний (базовий) адрес поточного сегмента коду;
eip/ip – регістр вказівник команд, в якому знаходиться значення зміщення в пам’яті наступної команди, яка підлягає до виконання. Тип регістра залежить від режиму адресації use32 або use16.
Таким чином, команди передачі керування змінюють вміст регістрів cs і eip і в результаті виконується не наступна по порядку команда, а команда в іншому місці програми. Конвеєр всередині МП при цьому скидується.
Команди переходів можна розділити на три групи:
Команди безумовної передачі керування:
Команди безумовного переходу;
виклик процедури і повернення із процедури;
виклик програмних переривань і повернення із програмних переривань.
Команди умовної передачі керування:
команди переходу по результату команди порівняння;
команди переходу по стану певного прапора;
команди переходу по вмісту регістра exc/cx;
Команди керування циклом:
команда організації цикла із лічильником ecx/cx;
команда організації цикла із лічильником ecx/cx з можливістю дострокового виходу із цикла по додатковій умові.
Щоб позначити місце куди необхідно передати керування, використовується мітка. Мітка
це символічне ім’я, що позначає певну комірку пам’яті, призначену для використання в якості операнда в командах передачі керування. Мітці асемблер присвоює три атрибути:
ім’я сегмента кода, де ця мітка описана;
зміщення – віддаль в байтах від початку сегмента, де описана мітка;
тип мітки, або атрибут віддалі (near – перехід на мітку можливий тільки в межах сегменту, far - перехід на мітку можливий в результаті між сегментної передачі керування).
Мітку можна описати двома способами:
оператором : ( символічне_ім’я : [ команда ассемблера ] );
директивою label ( символічне_ім’я label: [ команда ассемблера ] ).
З допомогою оператора : можна визначити тільки мітку типу near. Ця мітка може використовуватися в якості операнда в командах умовного jcc і безумовного jmp, call переходу, які повинні бути у тому ж сегменті що і мітка.
Директива label визначає мітки типу far. Мітка може бути тільки одного типу - near або
far. Для того, щоб зробити видимим ім’я мітки ззовні, застосовується директива public: public m _far ; зробити мітку видимою для зовнішніх програм
…
m_far label far ; визначення мітки дального типу
m_near: ; визначення мітки ближнього типу
Другий випадок застосування директиви label – це організація доступу до однієї області пам’яті, як до області, що містить дані різних типів:
mas_b label byte mas_w dw 15 dup (?)
...
mov mas_b+10, al ; записати в 11 байт із al
mov mas_w, ax ; записати в перше слово області mas_w із ах
До міток має також пряме відношення – лічильник адреса команд (зміщення поточної команди відносно початку сегмента). Для роботи із цим лічильником є дві можливості:
o використання міток, атрибуту зміщення яких транслятор присвоює значення лічильника адреса тієї команди, перед якою вони появились;
o застосування спеціального символу $ для позначення лічильника адреса команд. Цей символ дозволяє у любому місці програми використовувати числове значення лічильника адреса.
.data
Str_Mes db “Testova stroka”
Len_mes=$-Str_Mes ; Len_mes дорівнює довжині строчки Str_Mes.
Для встановлення значення лічильника адреса в абсолютне значення використовується директива ORG вираз. Наприклад: org 100h. Цю директиву завжди використовують при створенні виконуваного файлу з типом .com для резервування префікса програмного сегменту величною 256 байт (100h).