
- •"Програмне забезпечення автоматизованих систем"
- •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. Організація й керування дисками
1. Стек
У ПК є спеціальні команди роботи зі стеком, тобто областю пам'яті, доступ до елементів якої здійснюється за принципом "останнім записаний - першим прочитаний". Але для того, щоб можна було скористатися цими командами, необхідне дотримання ряду умов.
Під стек можна відвести область у будь-якому місці пам'яті. Розмір її може бути будь-яким, але не повинен перевершувати 64Кб, а її початкова адреса повинна бути кратним 16. Інакше кажучи, ця область повинна бути сегментом пам'яті; вона називається сегментом стека. Початок цього сегмента (перші 16 біт початкової адреси) повинен обов'язково зберігатися в сегментному регістрі SS.
Збережені в стеці елементи можуть мати будь-який розмір, однак треба ураховувати, що в ПК є команди запису в стек і читання з нього тільки слів. Тому для запису байта в стек його треба попередньо розширити до слова, а запис або читання подвійних слів здійснюються парою команд.
У ПК прийнято заповнювати стек знизу нагору, від більших адрес до менших: перший елемент записується в кінець області, відведеної під стек, другий елемент - у попередній осередок області й т.д. Зчитується завжди елемент, записаний у стек останнім. У зв'язку з цим нижня границя стека завжди фіксована, а верхня - змінюється. Слово в пам'яті, у якому перебуває елемент стека, записане останнім, називається вершиною стека. Адреса вершини, відлічена від початку сегмента стека, зобов'язаний перебувати в покажчику стека - регістра SP. Таким чином, абсолютна адреса вершини стека визначається парою SS:SP.
-і-і- -і-і- -і-і-
SS:SP | | SS:SP | | SS:SP | |
| -і-і- запис | -і-і- читання | -і-і-
| | | =======> -і-і>| b | =======> | | |
| -і-і- у стек -і-і- зі стека | -і-і-
-і-і->| a | | a | -і-і>| a |
-і-і- -і-і- -і-і-
Значення 0 у регістрі SP свідчить про те, що стек повністю заповнений (його вершина "дійшла" до початку області стека). Тому для контролю за переповненням стека треба перед новим записом у стек провіряти умову SP=0 (сам ПК цього не робить). Для порожнього стека значення SP повинне рівнятися розміру стека, тобто пари SS:SP повинна вказувати на байт, що випливає за останнім байтом області стека. Контроль за читанням з порожнього стека, якщо треба, зобов'язана робити сама програма.
Початкова установка регістрів SS й SP може бути зроблена в самій програмі, однак в MASM передбачена можливість автоматичного завантаження цих регістрів. Якщо в директиві SEGMENT, що починає опис сегмента стека, указати параметр STACK, тоді асемблер (точніше, завантажник) перед тим, як передати керування на першу команду машинної програми, завантажить у регістри SS й SP потрібні значення. Наприклад, якщо у програмі сегмент стека описаний в такий спосіб:
ST SEGMENT STACK
DB 256 DUP(?) ;розмір стека - 256 байтів
ST ENDS
і якщо під цей сегмент була виділена область пам'яті починаючи з абсолютної адреси 12340h, тоді до початку виконання програми в регістрі SS виявиться величина 1234h, а в регістрі SP - величина 100h (=256). Відзначимо, що ці значення відповідають порожньому стеку.