- •Затверджую Начальник спеціальної кафедри № 5
- •Методична розробка
- •Тема 1. Мови асемблера та їх використання для побудови базових елементів системних програм.
- •Тема 1/3
- •Контрольні запитання про таблиці системних програм
- •Принципи побудови професійних системних програм
- •Короткі теоретичні відомості
- •Семантичне або змістовне налагодження проектів
- •Знайомство зі створенням багатомодульних проектів з використанням мов програмування високого рівня Створення проектів, орієнтованих на налагодження системних програм
- •Синтаксичне налагодження проектів
- •2. Використання імен даних, їх структур та полів у вставках на мові асемблера
- •Організація вставок на мові Асемблера
- •3. Програмування обробки математичних виразів і операцій присвоювання та їх налагодження
- •Основні способи використання полів структур у вставках на мові Асемблера
- •Структура програмного шаблона виконання роботи
- •Рекомендації з використання функції відображення
- •Формати для виведення даних функціями форматного виведення
- •Завдання на роботу
2. Використання імен даних, їх структур та полів у вставках на мові асемблера
При використанні вставок на мові Асемблер для доступу до даних можуть використовуватись або явні адреси, як у відновленому тексті на мові асемблера, або безпосередньо імена використані у мові високого рівня.
Організація вставок на мові Асемблера
При вставках на мові Асемблера текст коду включається в блоки вигляду:
_asm{
...
}
Приклад: якщо для змінних або аргументів a, b, c, описаних на мові С типом short потрібно реалізувати вираз
c = a * b – c;
то вставка може мати вигляд:
_asm{
mov ax,a ; Завантаження a в акумулятор
imul b ; Додавання b в акумулятор
sub ax,c ; Віднімання c з акумулятора
mov c,ax ; Збереження c з акумулятора
}
Для цілих даних без знака типа unsigned відповідна вставка нічим не відрізняється від попередньої, але при вставках слід додержувати відповідність розміру регістрів довжині типу даних у мові C. При використанні операцій множення для цілих даних (mul – без знака і imul – зі знаком) слід враховувати, що переший аргумент знаходиться в акумуляторі (al – для однобайтних даних, ax – для двобайтних даних або eax - для чотирибайтних даних), добуток формується в розширеному акумуляторі (ax – для однобайтних даних, (dx, ax) – для двобайтних даних або (edx, eax) - для чотирибайтних даних) і займає вдвічі більше місця ніж аргументи. При одержанні результатів цілого ділення та залишку (командами div – без знака і idiv – зі знаком) перший аргумент повинен бути розміщений в регістрах ax, (dx, ax) або (edx, eax), частка формується в основному акумуляторі ax, ax або eax, а залишок – в розширенні акумуляторів al, dx або edx.
При роботі з даними з плаваючою точкою дії виконуються в регістрах з плаваючою точкою. Приклад вставки для того самого виразу з даним з плаваючою точкою типів float або double матимуть вигляд:
_asm{
fld a ; Завантаження a у верхівку стека регістрів st
fmul b ; Додавання b у верхівку стека регістрів st
fsub c ; Віднімання c з у верхівки стека регістрів st
fst c ; Збереження c з у верхівки стека регістрів st
}
Для зміни поточних розмірів даних в аргументах машинних команд, розміщених в пам’яті, використовується операції перевизначення розмірів: byte ptr – для даних розміром в байт (типи char, unsigned char), word ptr – для даних розміром в слово (типи short, unsigned short), dword ptr – для даних розміром в подвійне слово (типи int, unsigned int, unsigned, long, unsigned long, float), qword ptr – для даних розміром в чотири слова (типи _int64, double) і tbyte ptr – для даних розміром в десять байтів (тип long double). При необхідності задавання індексації або базування операнда команди одним або двома базовими регістрами використовуються позначення регістрів в квадратних дужках: [eax], [ebx], [ecx], [edx], [esi], [edi], [ebp], [esp], до одного з яких можна дописати масштабний множник *2, *4 або *8 залежно від кількості байтів в елементі масива. При необхідності задавання префікса зміни сегмента перед операндом або його частиною задаються імена сегментних регістрів з двокрапкою: ds:, cs:, ss: es:, fs: і gs:.
