
- •"Програмне забезпечення автоматизованих систем"
- •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. Організація й керування дисками
3. Запис команд в masm
Зі сказаного ясно, що та сама операція залежно від типів операдов записується у вигляді різних машинних команд: наприклад, у ПК є 28 команд пересилання байтів і слів. У той же час в MASM всі ці "родинні" команди записуються одноманітно: наприклад, всі команди пересилання мають ту саму символьну форму запису:
MOV op1,op2 (op1:=op2)
Аналізуючи типи операндов, асемблер сам вибирає підходящу машинну команду.
У загальному випадку команди записуються в MASM у такий спосіб:
мітка: мнемокод операнди ; коментар
Мітка із двокрапкою, а також крапка з коми й коментар можуть бути відсутні. Мітка відіграє роль імені команди, її можна використати в командах переходу на дану команду. Коментар не впливає на зміст команди, а лише пояснює її.
Мнемонічні назви операцій повністю перераховані в главі 2.
Операнди, якщо є, перераховуються через кому. Основні правила запису операндів наступні.
Регістри вказуються своїми іменами, наприклад:
MOV AX,SI ;обоє операнда - регістри
Безпосередні операнди задаються константними вираженнями (їх значеннями є константи-числа), наприклад:
MOV BH,5 ;5 - безпосередній операнд
MOV DI,SIZE X ;SIZE X (число байтів, займаних змінної X) - безпосередній операнд.
Адреси описуються адресними вираженнями (наприклад, іменами перемінних), які можуть бути модифіковані по одному або двом регістрам; наприклад, у наступних командах перші операнди задають адреси:
MOV X,AH
MOV X[BX][DI],5
MOV [BX],CL
При записі команд у символьній формі необхідно уважно слідкувати за правильною вказівкою типу (розміру) операндов, щоб не було помилок. Тип звичайно визначається по зовнішньому вигляді одного з них, наприклад:
MOV AH,5 ;пересилання байта, тому що AH - байтовий регістр
MOV AX,5 ;пересилання слова, тому що AX - 16-бітовий регістр
(операнд 5 може бути байтом і словом, по ньому не можна визначити розмір пересилаючої величини, що)
MOV [BX],300 ;пересилання слова, тому що число 300 не може бути байтом
Якщо по зовнішньому вигляді можна однозначно визначити тип обох операндів, тоді ці типи повинні збігатися, інакше асемблер зафіксує помилку. Приклади:
MOV DS,AX ;обоє операнда мають розмір слова
MOV CX,BH ;помилка: регістри CX й BH мають різні розміри
MOV DL,300 ;помилка: DL - байтовий регістр, а число 300 не
;може бути байтом
Можливі ситуації, коли по зовнішньому вигляді операндів не можна визначити тип жодного з них, як, наприклад, у команді
MOV [BX],5
Тут число 5 може бути й байтом, і словом, а адреса з регістра BX може вказувати й на байт пам'яті, і на слово. У подібних ситуаціях асемблер фіксує помилку. Щоб уникнути її, треба уточнити тип одного з операндов за допомогою оператора з назвою PTR:
MOV BYTE PTR [BX],5 ;пересилання байта
MOV WORD PTR [BX],5 ;пересилання слова
(Оператори - це різновид виражень мови MASM, аналогічні функціям.)
Оператор PTR необхідний й у тому випадку, коли треба змінити тип, запропонований імені при його описі. Якщо, наприклад, X описане як ім'я змінної розміром у слово:
X DW 999
і якщо треба записати в байтовий регістр AH значення тільки першого байта цього слова, тоді скористатися командою
MOV AH,X
не можна, тому що її операнди мають різний розмір. Цю команду треба записати трохи інакше:
MOV AH,BYTE PTR X
Тут конструкція BYTE PTR X означає адресу X, але вже розглянутий не як адреса слова, а як адреса байта. (Нагадаємо, що з одного й того же адреси може починатися байт, слово й подвійне слово; оператор PTR уточнює, осередок якого розміру ми маємо на увазі.)
І ще одне зауваження. Якщо в символьній команді, що оперує з словами, зазначений безпосередній операнд розміром у байт, як, наприклад, у команді
MOV AX,80h
та виникає деяка неоднозначність: що буде записано в регістр
AX - число 0080h (+128) або 0FF80h (-128)? У подібних ситуаціях асемблер формує машинну команду, де операнд - байт розширений до слова, причому розширення відбувається зі знаком, якщо операнд був записаний як негативне число, і без знака в інших випадках. Наприклад:
MOV AX,-128 ; => MOV AX,0FF80h (A:=-128)
MOV AX,128 ; => MOV AX,0080h (A:=+128)
MOV AX,80h ; => MOV AX,0080h (A:=+128)
Лекція 6
Тема: Сегментування
1. Сегменти пам’яті, сегментні регістри
2. Регістри по домовленості
3. Сегментування, базування та індексація адреси
4. Програмні сегменти. Директива ASSUME
5. Початкове завантаження сегментних регістрів
6. Посилання вперед