- •2. Структура регістра eflags
- •3. Організація оперативної пам’яті. Сегментована модель оперативної пам’яті. Формування адреси в реальному режимі
- •4. Формати і типи даних. Формат машинних команд. Система переривань
- •5. Десяткова арифметика. Форми зображення десяткових чисел
- •7. Ділення ascii-чисел.
- •6. Директиви сегментації. Директиви proc і endp
- •7. Опис простих типів мовою асемблера
- •10. Синтаксис команд мовою асемблера
- •11. Команди передач даних
- •Xchg ax, data1; (data2) в data1, (ax) – початковий стан
- •12. Стекові передачі даних
- •13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців
- •14. Команди передачі даних movXx. Команда setCc. Команда xlat
- •15. Команди додавання, віднімання і порівняння
- •Inc reg/mem; Розмір 8/16/32.
- •16. Команди множення і ділення
- •20. Команди логічних операцій. Команди зсувів
- •22. Команди операцій з двійковими ланцюжками
- •23. Команди передачі керування (безумовні переходи)
- •24. Команди умовних переходів і команди керування циклами
- •26. Команди переривань і повернення з переривань
- •Загальні поняття.
- •Використання префіксів в ланцюжкових командах.
- •Команда movs.
- •Команда cmps.
- •Команда scas.
- •Команда lods.
- •Команда stos.
- •Команди введення/виведення ланцюжків.
- •29. Команди керування процесором
- •Команди, які впливають на прапорці.
- •Команди синхронізації.
- •Системні команди
- •31. Формати даних, які підтримуються fpu
- •Параметри для трьох форматів в таблиці
- •32. Програмна модель fpu
- •33. Слово стану sw і слово керування cw пристрою fpu.
- •Відповідність між кодом умови і прапорцями
- •34. Команди передач даних fpu: завантаження, збереження, збереження з вибором зі стека, обміну, завантаження сталих.
- •35. Арифметичні команди fpu: додавання, віднімання, множення, ділення.
- •36. Додаткові арифметичні команди fpu.
- •37. Команди порівняння fpu
- •38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.
- •39. Команди керування пристроєм fpu
- •40. Спеціальні числові значення та особливі обчислювальні ситуації
7. Опис простих типів мовою асемблера
Прості типи даних є базовими для опису більш складних типів. Для опису простих типів використовуються директиви резервування і ініціалізації даних, які вказують трансляторові на виділення певної кількості оперативної пам’яті. Можна вважати, що директиви резервування і ініціалізації даних визначають змінні. Ці директиви не мають машинного еквіваленту. Транслятор, опрацьовуючи таку директиву, виділяє потрібну кількість байтів оперативної пам’яті і, якщо потрібно, ініціалізує цю область певним значенням. Директиви резервування і ініціалізації даних простих типів можна зобразити так:
[ім’я] код-директиви вираз1, вираз2, …, виразN
-
ім’я – не обов’язковий елемент директиви, записується за синтаксичними правилами означення ідентифікатора мовою асемблер і використовується для іменування області оперативної пам’яті, тобто це деяке символічне ім’я мітки або комірки пам’яті в сегменті даних;
-
код-директиви – може набувати значень:
db – резервування пам’яті для даних розміру 1 байт;
dw – резервування пам’яті для даних розміру 2 байти;
dd – резервування пам’яті для даних розміру 4 байти;
df – резервування пам’яті для даних розміру 6 байтів;
dp – резервування пам’яті для даних розміру 6 байтів;
dq – резервування пам’яті для даних розміру 8 байтів;
dt – резервування пам’яті для даних розміру 10 байтів.
-
виразI – ? | значення-ініціалізації | ім’я | n dup (вираз), тобто вираз – ітеративна конструкція, яка дозволяє послідовне занесення у фізичну пам’ять вираз в дужках n разів.
Знак запитання (?) означає, що в поле пам’яті, яке резервується для змінної не записується конкретне значення, фактично це значення може бути будь-яким, можливо сформованим попередніми командами; значення-ініціалізації – значення, яке буде записане в поле, зарезервоване даною директивою; ім’я – у поле, зарезервоване для змінної, записується адреса (повна – seg:offset, або offset); n dup (вираз) – означає записати значення вираз n разів, зарезервувавши n полів пам’яті розміру, вказаного в директиві.
10. Синтаксис команд мовою асемблера
Програма мовою асемблера – набір речень, які можуть бути командами, макрокомандами, директивами або коментарями. Для запису речень використовуються наступні поняття:
-
ім’я мітки – ідентифікатор, значенням якого є адреса першого байта того речення, яке він позначає;
-
ім’я – ідентифікатор, за допомогою якого можна відрізнити дану директиву від інших;
-
код операції (коп) і директива – мнемонічне позначення машинної команди, макрокоманди або директиви;
-
операнди – частини команди, макрокоманди або директиви, які позначають об’єкти, над якими виконуються дії. Операнди описуються виразами з числовими і текстовими сталими, мітками і ідентифікаторами змінних з використанням знаків операцій і певних зарезервованих слів.
Припустимі символи:
-
Всі латинські букви A-Z, a-z. Великі і малі букви не розрізняються за домовленістю.
-
Цифри від 0 до 9.
-
Знаки ?, @, $, _, &.
-
Розділювачі , . : [ ] ( ) < > { } + – * / % ! “ ” ? \ = # ^
Речення формуються з лексем – наборів, які синтаксично нероздільні для мови допустимих символів. Лексемами є:
-
Ідентифікатори – набори символів, які використовуються для позначення кодів операцій, імен змінних і міток. Ідентифікатор може складатися з одного або декількох символів. Як символ можна використовувати букви латинського алфавіту, цифри і спеціальні знаки – _, ?, $, @. Ідентифікатор не може починатися символом цифри. Довжина ідентифікатора до 255 символів, хоча транслятор сприймає лише перші 32, а решту ігнорує. Можна регулювати довжину ідентифікаторів, використовуючи опцію /mvn. Можна вказати, щоб транслятор розрізняв (опція /ml), не розрізняв (опція /mu) великі і малі букви (або розрізняв великі і малі букви (опція /mx) тільки в спільних ідентифікаторах);
-
ланцюжки символів – набори символів, які знаходяться між апострофами або взяті в лапки;
-
цілі числа в одній із систем числення: двійковій (набір двійкових цифр, після якого вказано символ b. Наприклад, 11010001b), десятковій та шістнадцятковій, причому шістнадцяткові числа – набір шістнадцяткових цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F), який закінчується символом h. Якщо цей набір починається символами a, A, b, B, c, C, d, D, e, E, f, F, то перед цим числом потрібно писати обов’язково 0;
Складові частини речень називаються операндами. Вони описують об’єкти, над якими або за допомогою яких виконуються певні дії. Наведемо класифікацію операндів:
-
сталі (безпосередні операнди) – число, рядок, ім’я або вираз, які мають певні фіксовані значення. Ім’я не повинно бути переміщуваним, тобто залежати від адреси завантаження програми в пам’ять. Воно може бути визначене операторами equ або =
const equ 7
ind = const – 3
mov bl, ind; еквівалентно mov bl, 4; 4 тут безпосередній операнд
-
переміщуваний операнд – будь-яке символьне ім’я, яке зображує деяку адресу пам’яті. Може позначати розташування команди в пам’яті (якщо це мітка) або даних (якщо це ім’я області пам’яті в сегменті даних).
-
лічильник адреси – специфічний операнд. Позначається знаком $. Специфіка в тому, що коли транслятор зустрічає в початковій програмі цей символ, то підставляє замість нього поточне значення лічильника адреси.
-
регістровий операнд – ім’я регістра (імена регістрів визначені в програмній моделі процесора).
Операнди можуть бути складовими частинами виразів, які є комбінаціями операндів і операторів. Вкажемо деякі оператори.
-
арифметичні оператори. До них відносяться унарні оператори “+” і “–”, бінарні “+”, “–”, оператори множення “*”, цілочислового ділення “/”, одержання залишку від ділення “mod”;
-
індексний оператор []. Наприклад
mov dx, mas[si] ; пересилка слова за адресою mas+(si) в регістр dx
-
оператор перевизначення типу type ptr для перевизначення або уточнення типу мітки або змінної. Тип type може набувати значень: byte, word, dword, qword, tbyte, near, far. Наприклад:
d_wrd dd 0
…
mov al, byte ptr d_wrd +1; пересилка другого байта з подвійного слова
-
оператор перевизначення сегмента : (дві крапки) заставляє обчислювати адресу відносно конкретної сегментної складової, яка задається явно
mov bx, fs:array;
сегментна складова змінної array обчислюватиметься відносно сегментної складової з регістра fs
-
оператор одержання сегментної складової seg повертає фізичну адресу сегмента для виразу, яким може бути мітка, змінна, ім’я сегмента або деяке символьне ім’я. Синтаксис цього оператора
seg вираз
-
оператор одержання зміщення виразу offset, синтаксис якого:
offset вираз
Приклад застосування останніх двох операторів
data segment
x dw 14
…
code segment
…
mov ax, seg x
mov es, ax
mov di, offset x; У парі регістрів es:di повна адреса x