
- •"Програмне забезпечення автоматизованих систем"
- •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. Подання символів і рядків
На символ приділяється один байт пам'яті, у який записується код символу - ціле від 0 до 255. У ПК використається система кодування ASCII(American Standard Code for Information Interchange). Вона, звичайно, не містить кодів російських букв, тому в нашій країні застосовується деякий варіант цієї системи з російськими буквами (звичайно це альтернативне кодування ГОСТа).
Деякі особливості цих систем кодування:
- код пробілу менше коду будь-якої букви, цифри й взагалі кожного графічно представлення символу;
- коди цифр упорядковані по величині цифр і не містять пропусків, т.е. з нерівності код ('0')<=код(c)<=код('9') треба, що c - цифра;
- коди більших латинських букв упорядковані відповідно до алфавіту й не мають пропусків; аналогічно з малими латинськими буквами;
- (в альтернативному кодуванні ГОСТа) коди російських букв (як більших, так і малих) упорядковані відповідно до алфавіту, але між ними є коди інших символів.
Рядок (послідовність символів) розміщається в сусідніх байтах пам'яті (у не переверненому виді): код першого символу рядка записується в першому байті, код другого символу - у другому байті й т.п. Адресою рядка вважається адреса її першого байта.
У ПК рядком уважається також і послідовність слів (звичайно це послідовність цілих чисел). Елементи таких рядків розташовуються в послідовних комірках пам'яті, але кожен елемент представлений в "перевернутому" виді.
6. Подання адрес
Адреса - це порядковий номер комірки пам'яті, тобто ненегативне ціле число, тому в загальному випадку адреси представляються так само, як і беззнакові числа. Однак у ПК є ряд особливостей у поданні адрес.
Справа в тому, що в ПК терміном "адресу" позначають різні речі. Часто під адресою розуміється 16-бітовий зсув (offset) адреса осередку, відлічений від початку сегмента (області) пам'яті, якому належить цей осередок. У цьому випадку під адресу приділяється слово пам'яті, причому адрес записується в "переверненому" виді (як і числа-слова взагалі).
В іншому випадку під "адресою" розуміється 20-бітове абсолютне адрес деякої комірки пам'яті. У силу ряду причин у ПК такий адрес задається не як 20-бітове число, а як пари "сегмент : зсув", де "сегмент" (segment) - це перші 16 бітів початкової адреси сегмента памя’ти, якому належить осередок, а "зсув" - 16-бітова адреса цього осередку, відлічений від початку даного сегмента пам'яті (величина 16*сегмент+зсув дає абсолютний адреса осередку). Такі пари записуються у вигляді подвійного слова, причому (як і для чисел) в "перевернутім" виді: у першому слові розміщається зсув, а в другому - сегмент, причому кожне із цих слів у свою чергу представлене в "перевернутім" виді. Наприклад, пари 1234h:5678h буде записана так:
-і-і-і-і-і-і-і-і-і-і-
| 78 | 56 | 34 | 12 |
-і-і-і-і-і-і-і-і-і-і-
зсув сегмент
7. Директиви визначення даних
Для того щоб у програмі на MASM зарезервувати комірки пам'яті під константи й змінні, необхідно скористатися директивами розпізнавання даних - з назвами DB (описує дані розміром у байт), DW (розміром у слово) і DD (розміром у подвійне слово). (Директиви, або команди асемблеру, - це пропозиції програми, якій її автор повідомляє якусь інформацію асемблеру або просить щось зробити додатково, крім перекладу символьних команд на машинну мову.)
У найпростішому випадку в директиві DB, DW або DD описується одна константа, який дається ім'я для наступних посилань на неї. По цієї директиві асемблер формує машинне подання константи (якщо треба, "перевертає" її) і записує в чергову ділянку пам'яті. Адреса цього осередку стає значенням імені: всі входження імені в програму асемблер буде заміняти на цю адресу. Імена, указані в директивах DB, DW й DD, називаються іменами змінних (на відміну від міток - імен команд).
В MASM числа записуються в нормальному (непереверненому) виді в системах числення з підставою 10, 16, 8 або 2. Десяткові числа записуються як звичайно, за шістнадцятирічним числом ставиться буква h (якщо число починається з "цифри" A, B, ..., F, те спочатку обов'язковий 0),за восьмирічним числом - буква q або o, за двійковим числом - буква b.
Приклади:
A DB 162 ;описати константа-байт 162 і дати їй ім'я A
B DB 0A2h ;така ж константа, але з ім'ям B
З DW -1 ;константа-слово -1 з ім'ям З
D DW 0FFFFh ;така ж константа-слово, але з ім'ям D
E DD -1 ;-1 як подвійне слово
Константи-символи описуються в директиві DB подвійно: указується або код символу (ціле від 0 до 255), або сам символ у лапках (одинарних або подвійних); в останньому випадку асемблер сам замінить символ на його код. Наприклад, що випливають директиви еквівалентні (2A - код зірочки в ASCII):
CH DB 02Ah
CH DB '*'
CH DB "*"
Константи-адреси, як правило, задаються іменами. Так, по директиві
ADR DW CH
буде відведене слово пам'яті, якому дається ім'я ADR й у яке запишеться адреса (зсув), що відповідає імені CH. Якщо таке ж ім'я описати в директиві DD, те асемблер автоматично додасть до зсуву імені його сегмент і запише зсув у першу половину подвійного слова, а сегмент - у другу половину.
По кожній з директив DB, DW й DD можна описати змінну, тобто відвести осередок, не давши їй початкового значення. У цьому випадку в правої частини директиви вказується знак питання:
F DW ? - відвести слово й дати йому ім'я F, нічого в цей байт не записувати.
В одній директиві можна описати відразу кілька констант й/або перемінних того самого розміру, для чого їх треба перелічити через кому. Вони розміщаються в сусідніх комірках пам'яті. Приклад:
G DB 200, -5, 10h, ?, 'F'
Ім'я, зазначене в директиві, вважається як іменним першу з констант.
Для посилань на інші в MASM використаються вираження виду <ім'я> + <ціле>; наприклад, для доступу до байта із числом -5 треба вказати вираження G+1, для доступу до байта з 10h - вираження G+2 і т.д.
Якщо в директиві DB перераховані тільки символи, наприклад:
S DB 'a','+','b',
тоді цю директиву можна записати коротше, уклавши всі ці символи в одні лапки:
S DB 'a+b'
І, нарешті, якщо в директиві описується трохи однакових констант (змінних), те можна скористатися конструкцією повторення
k DUP(a,b,...,c)
яка еквівалентна повтореної k раз послідовності a,b,...,c.
Наприклад, директиви
V1 DB 0,0,0,0,0
V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2
можна записати більш коротко в такий спосіб:
V1 DB 5 DUP(0)
V2 DW 9 DUP(?), 'a', 4 DUP(1,2)
Лекція 5
Тема: Структура команд. Виконавчі адреси