Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асм.docx
Скачиваний:
16
Добавлен:
27.10.2018
Размер:
644.06 Кб
Скачать

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. Синтаксис команд мовою асемблера

Програма мовою асемблера – набір речень, які можуть бути командами, макрокомандами, директивами або коментарями. Для запису речень використовуються наступні поняття:

  • ім’я мітки – ідентифікатор, значенням якого є адреса першого байта того речення, яке він позначає;

  • ім’я – ідентифікатор, за допомогою якого можна відрізнити дану директиву від інших;

  • код операції (коп) і директива – мнемонічне позначення машинної команди, макрокоманди або директиви;

  • операнди – частини команди, макрокоманди або директиви, які позначають об’єкти, над якими виконуються дії. Операнди описуються виразами з числовими і текстовими сталими, мітками і ідентифікаторами змінних з використанням знаків операцій і певних зарезервованих слів.

Припустимі символи:

  1. Всі латинські букви A-Z, a-z. Великі і малі букви не розрізняються за домовленістю.

  2. Цифри від 0 до 9.

  3. Знаки ?, @, $, _, &.

  4. Розділювачі , . : [ ] ( ) < > { } + – * / % ! “ ” ? \ = # ^

Речення формуються з лексем – наборів, які синтаксично нероздільні для мови допустимих символів. Лексемами є:

  • Ідентифікатори – набори символів, які використовуються для позначення кодів операцій, імен змінних і міток. Ідентифікатор може складатися з одного або декількох символів. Як символ можна використовувати букви латинського алфавіту, цифри і спеціальні знаки – _, ?, $, @. Ідентифікатор не може починатися символом цифри. Довжина ідентифікатора до 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]