
- •"Програмне забезпечення автоматизованих систем"
- •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. Організація й керування дисками
5. Початкове завантаження сегментних регістрів
Директива ASSUME повідомляє асемблеру про те, по яких регістрах він повинен сегментувати імена з яких сегментів, і "обіцяє", що в цих регістрах будуть перебувати початкові адреси цих сегментів. Однак завантаження цих адрес у регістри сама директива не здійснює. Зробити таке завантаження - обов'язок самої програми, із завантаження сегментних регістрів і повинно починатися виконання програми. Робиться це так.
Оскільки в ПК немає команди пересилання безпосереднього операнда в сегментний регістр (а ім'я, тобто початок, сегменту - це безпосередній операнд), то таке завантаження доводиться робити через якийсь другий, несегментний, регістр (наприклад, AX):
MOV AX,DT1 ;AX:=початок сегмента DT1
MOV DS,AX ;DS:=AX
Аналогічно завантажується й регістр ES.
Завантажувати регістр CS на початку програми не треба: він, як і лічильник команд IP, завантажується операційною системою перед тим, як починається виконання програми (інакше не можна було б почати її виконання). Що ж стосується регістра SS, використовуваного для роботи зі стеком, то він може бути завантажений так само, як і регістри DS й ES, однак в MASM передбачена можливість завантаження цього регістру ще до виконання програми
6. Посилання вперед
Зустрічаючи в символьній команді посилання назад - ім'я, що описане у тексті програми до цієї команди, асемблер уже має необхідну інформацію про ім'я й тому може правильно відтранслювати цю команду. Але якщо в команді зустрінеться посилання вперед, тобто ім'я, що не було описано до команди і яке, напевно, буде описано пізніше, то асемблер у більшості випадків не зможе правильно відтранслювати цю команду. Наприклад, не знаючи, у якому програмному сегменті буде описано це ім'я, асемблер не може визначити, по якому сегментному регістру треба сегментувати ім'я, і тому не може визначити, треба чи ні розміщати перед відповідною машинною командою префікс заміни сегменту а, якщо треба, то який саме.
У подібній ситуації асемблер діє в такий спосіб: якщо в команді зустрілося посилання вперед, то він робить деяке припущення щодо цього імені й уже на основі цього припущення формує машинну команду. Якщо потім (коли зустрінеться опис імені) виявиться, що дане припущення було невірним, тоді асемблер намагається виправити сформульовану ним раніше машинну команду. Однак це не завжди вдається: якщо правильна машинна команда повинна займати більше місця, ніж машинна команда, побудована на основі припущення (наприклад, перед командою треба насправді вставити префікс заміни сегмента), тоді асемблер фіксує помилку (як правило, це помилка номер 6: Phase error between passes.)
Яке ж припущення робить асемблер, зустрічаючи посилання вперед? У всіх командах, крім команд переходу, асемблер припускає, що ім'я буде описано в сегменті даних і тому сегментується по регістру DS. Це варто враховувати при складанні програми: якщо в команді зустрічається посилання вперед на ім'я, що описане в сегменті, на початок якого вказує сегментний регістр, відмінний від DS, то перед таким ім'ям автор програми повинен написати відповідний префікс. Приклад:
code segment
assume cs:code
x dw ?
beg: mov ax,x ;тут замість cs:x можна записати просто x
mov cs:y,ax ;тут обов'язково треба записати cs:y
y dw ?
code ends
Лекція 7
Тема: Операції з рядками