
- •"Програмне забезпечення автоматизованих систем"
- •1. Оперативна пам'ять
- •2. Регістри
- •3. Прапори
- •1. Переходи
- •2. Безумовні переходи
- •3. Умовні переходи
- •4. Команди керування циклом
- •1. Подання даних арифметичні операції
- •2. Цілі числа без знака
- •3. Цілі числа зі знаком
- •4. Особливості виконання арифметичних операцій
- •5. Подання символів і рядків
- •6. Подання адрес
- •7. Директиви визначення даних
- •1. Структура команд. Виконавчі адреси
- •2. Формати команд
- •3. Запис команд в masm
- •1. Сегменти пам’яті, сегментні регістри
- •2. Сегментні регістри по домовленості
- •3. Сегментування, базування й індексування адрес
- •4. Програмні сегменти. Директива assume
- •5. Початкове завантаження сегментних регістрів
- •6. Посилання вперед
- •1. Строкові операції
- •1. Стек
- •2. Основні стекові команди
- •1. Організація процедур та переривань
- •2. Передача параметрів процедурам через регістри, через стек, через таблиці, через глобальні області
- •3. Передача параметрів по ссылке
- •4. Передача параметрів по повернутому значенню
- •5. Передача параметрів в стеку
- •6. Локальні змінні
- •1. Процеси і потоки
- •1.1 Розподіл часу між потоками
- •1.2 Динамічна зміна рівня пріоритету потоку
- •2. Робота із процесами й потоками в Win32 api
- •1. Адресний простір процесу
- •2. Керування віртуальною пам'яттю. Vmm
- •3. Файли даних, що проектуються на згадку
- •4. Взаємодія процесів через загальну область даних. Когерентність
- •5. Купи
- •1. Визначення вікна. Компоненти й параметри вікон
- •2. Клас вікна
- •3. Ієрархія вікон
- •1. Обмін даними між процесами
- •2. Вилучений виклик процедур (rpc - Remote Procedure Call)
- •3. Синхронізація потоків
- •1. Загальний порядок обробки виключень
- •2. Фільтри й оброблювачі виключень
- •1. Загальна структура системного реєстру
- •2. Робота додатків із системним реєстром
- •1. Файлові структури
- •2. Робота з томами й каталогами
- •3. Синхронна робота з файлами
- •4. Асинхронна робота з файлами
- •1. Системні файли ntfs
- •2. Master File Table (mft)
- •3. Цілісність даних і здатність до самовідновлення.
- •4. Організація й керування дисками
2. Безумовні переходи
В MASM всі команди безумовного переходу позначаються однаково:
JMP op
але залежно від типу операнда, асемблер формує різні машинні команди.
1) Внутрісегментний відносний короткий перехід.
JMP i8 (IP:=IP+i8)
Тут i8 позначає безпосередній операнд розмірів у байт, що інтерпретується як знакове ціле від -128 до 127. Команда додає це число до поточного значення регістра IP, одержуючи в ньому адреса (зміщення) тієї команди, що повинна бути виконана наступної. Регістр CS при цьому не міняється.
Необхідно враховувати наступну особливість регістра IP. Виконання будь-якої команди починається з того, що в IP заноситься адреса наступної за їй команди, і тільки потім виконується властиво команда. Для команди відносного переходу це означає, що операнд i8 додається не до адреси цієї команди, а до адреси команди, що випливає за нею, тому, приміром, команда JMP 0 - це перехід на наступну команду програми.
При написанні машинної програми зрушення для відносних переходів доводиться обчислювати вручну, однак MASM рятує від цього неприємного заняття: в MASM у командах відносного переходу завжди указується мітка тієї команди, на яку треба передати керування, і асемблер сам обчислює зрушення, що він і записує в машинну команду. Звідси слідує, що в MASM команда переходу по мітці приймається не як абсолютний перехід, а як відносний.
По короткому переході можна передати керування тільки на ближчі команди програми - віддалені від команди, що випливає за командою переходу, до 128 байтів назад або до 127 байтів уперед. Для переходу на більше далекі команди використається
2) Внутрісегментний відносний довгий перехід.
JMP i16 (IP:=IP+i16)
Тут i16 позначає безпосередній операнд розміром у слово, який розглядається як знакове ціле від -32768 до 32767. Цей періхід аналогічний короткому переходу.
Відзначимо, що, зустрівши команду переходу з міткою, якою була помічена одна з попередніх (по тексту) команд програми, асемблер вираховує різницю між адресою цієї мітки й адресою команди переходу й по цьому зрушенню визначає, яку машинну команду відносного переходу - коротку або довгу - треба сформувати. Але якщо мітка ще не зустрічалася в тексті програми, тобто робиться перехід уперед, тоді асемблер, не знаючи ще адреси мітки, не може визначити, яку саме машинну команду відносного переходу формувати, тому він на усякий випадок вибирає команду довгого переходу. Однак ця машинна команда займає 3 байти, тоді як команда короткого переходу - 2 байта, і якщо автор програми на MASM прагне до економії пам'яті й знає заздалегідь, що перехід уперед буде на близьку мітку, то він повинен сповістити про це асемблеру, щоб той сформував команду короткого переходу. Така вказівка робиться за допомогою оператора SHORT:
JMP SHORT L
Для переходів назад оператор SHORT не потрібний: уже знаючи адресу мітки, асемблер сам визначить вид команди відносного переходу.
3) Внутрісегментний абсолютний непрямий перехід.
JMP r16 (IP:=[r]) або
JMP m16 (IP:=[m16])
Тут r16 позначає будь-який 16-бітовий регістр загального призначення, а m16 - адреса слова пам'яті. У цьому регістрі (слові пам'яті) повинен перебувати адреса, по якому й буде зроблений перехід. Наприклад, по команді JMP BX відбувається перехід за адресою, що перебуває в регістрі BX.
4) Міжсегментний абсолютний прямий перехід.
JMP seg:ofs (CS:=seg, IP:=ofs)
Тут seg - початок (перші 16 бітів початкової адреси) деякого сегмента пам'яті, а ofs - зсув у цьому сегменті. Пари seg:ofs визначають абсолютну адресу, по якій робиться перехід. В MASM ця пара завжди задається конструкцією FAR PTR <мітка>, що "говорить", що треба зробити перехід по зазначеній мітці, причому ця мітка - "далека", з іншого сегмента. Відзначимо, що асемблер сам визначає, який це
сегмент, і сам підставляє в машинну команду його початок, тобто seg.
5) Міжсегментний абсолютний непрямий перехід.
JMP m32 (CS:=[m32+2], IP:=[m32])
Тут під m32 розуміється адреса подвійного слова пам'яті, у якому знаходяться пари seg:ofs, що задає абсолютну адресу, по якому дана команда повинна виконати перехід. Нагадаємо, що в ПК величини розміром в подвійне слово зберігаються в "переверненому" виді, тому зсув ofs знаходиться в першому слові подвійного слова m32, а зсув seg - у другому слові (за адресою m32+2).
Команди міжсегментного переходу використаються тоді, коли команди програми розміщені не в одному сегменті пам'яті, а в декількох (наприклад, команд настільки багато, що в сукупності вони займають більше 64Кб, т.е. більше максимального розміру сегмента пам'яті). При переході з одного такого сегмента в інший необхідно міняти не тільки лічильник команд IP, але й уміст регістра CS, завантажуючи в останній початковий адреса другого сегмента. Така одночасна зміна обох цих регістрів і роблять команди міжсегментного переходу.
При записі в MASM команд переходу варто враховувати, що вони можуть сприйматися неоднозначно. Скажемо, як сприймати команду
JMP A
- як перехід по мітці A або як перехід за адресою, що зберігається в осередку з ім'ям A? Крім того, який це перехід - внутрісегментний або міжсегментний? Відповідь залежить від того, як описане ім'я A, і від того, коли описане ім'я A - до або після команди переходу. Нехай A описано до команди переходу ("посилання назад"). Якщо ім'ям а позначена деяка команда поточного сегмента команда (тобто A - позначка), тоді асемблер формує машинну команду внутрісегментного відносного переходу. Якщо ж A - ім'я змінної, тоді асемблер формує машинну команду непрямого переходу - внутрісегментного, якщо A описано в директиві DW, або міжсегментного, якщо A описано в директиві DD.
У випадку ж, якщо ім'я A описане після команди переходу ("посилання уперед"), асемблер завжди формує машинну команду внутрісегментного відносного довгого переходу. З обліком цього ім'я A обов'язково повинне мітити команду з поточного сегмента команд, інакше буде зафіксована помилка. Якщо таке трактування посилання вперед не задовольняє автора програми, тоді він зобов'язаний за допомогою оператора SHORT або PTR уточнити тип імені A:
JMP SHORT A ;внутрісегментний короткий перехід по мітці
JMP WORD PTR A ;внутрісегментний непрямий перехід
JMP DWORD PTE A ;міжсегментний непрямий перехід
Відзначимо, що перехід по мітці A з іншого сегмента команд завжди повинен указуватися за допомогою FAR PTR (незалежно від того, описана позначка A до або після команди переходу):
JMP FAR PTR A; міжсегментний перехід по мітці.