Model [ < модифікатор >] < тип >.
В цій директиві може бути вказано ще ряд параметрів. Єдиним необхідним параметром є параметр <тип>. Тип можна додатково модифікувати. Для цього необхідно вказати один із 4 модифікаторів:аnearstack; farstack; use16; use32. При першому стек і дані розташинані в межах одного сегменту; farstack вказує, що сегмент даних буде розташинаний за межами стеку. Nearstack використовується по замовчуванню у всіх стандартних моделях пам’яті. Він дозволяє організувати інтерфейс з мовами високого рівня. Тут глобальні дані розміщені в сегменті даних, а локальні – в сегменті стеку. Два останні модифікатори використовуються тільки для МП 80386 і старше, вони вказують які сегменти використовуються в програмі, 16-розрядні (64 Кб сегмент) і 32-розрядні (4Гб сегмент). Доцільно використовувати ці модифікатори при розробці програм при використанні 32-розрядних компіляторів.
Псевдооператори (директиви).
Псевдооператори керують роботою асемблера, а не МП. Вони дозволяють визначати сегменти і процедури (надавати імена програмам і елементам даних, резервувати області пом’яті та виконувати багато інших задач). Псевдооператори мають таку загальну форму запиту:а
[<ідентифікатор>] псевдооператор [<операнд>][; коментар].
Обов’язковим є тільки поле псевдооператори. Для одних псевдооператорів ідентифікатор обов’язковий, для інших заборонений, для третіх необов’язковий, це ж відноситься і до операнди, коментарі завжди необов’язкові. Псевдооператор може починатися в будь-якому місці рядка, він повинен бути віддаленим від попереднього поля хоча б одним пропуском. Ми розглянемо найбільш розповсюджені псевдооператори, їх можна поділити на дві групи: псевдооператори даних і псевдооператори керування лістингом. Псевдооператори даних можна розділити на 5 груп:а
1. Псевдооператори визначення ідентифікаторів. Вони дозволяють виразу присвоїти символічне ім’я, тобто ідентифікатор. В якості виразу може бути константа, адреса, інше символічне ім’я. Після такої директиви цей ідентифікатор можна використовувати в будь-якому місці де необхідно вказати вираз. Два оператори:аEQU і =, ці псевдооператори подібні, але між ними є істотна різниця:а
Позначені знаком “=” ідентифікатори можна перевизначати, а визначені псевдооператором EQU неможна. Псевдооператор EQU можна використовувати як з числовими такі з текстовими виразами, а псевдооператор “=” тільки з числовими. Приклади:
К1аEQU 1024 – присвоєння імені константі; T_1аEQU DS:[BP][SI]. Комбінації адрес DS:[BP][SI] присвоюється символічне ім’я, всюди в програмі замість комбінації цих адрес можна використовувати T_1. В_Т EQU B_T1, визначення синоніму, тобто ім’я В_Т буде мати те ж значення як і зміна В_Т1. REG1аEQU CX – присвоєння імені регістру. При використанні псевдооператора “=” в якості виразу можуть виступати математичні перетворення. В директиві EQU також можуть бути прості математичні перетворення, вони будуть виконані асемблером під час трансляції. Наприклад: CON1аEQU CON2*2 CONS1=24 CONS1=29 CONS1=CONS1+1.
2. Псевдооператори визначення даних. В асемблері можна використовувати комірки пам’яті для збереження поіменованих даних, тобто змінних. Найбільш використовуються такі псевдооператори для резервування пам’яті:1) DB – Define Byte; 2) DW – Define Word; 3) DD – Define Double Word; 4) DQ; 5) DF; 6) DT. В основному вони розрізняються по об’єму пам’яті, який резервується. Псевдооператори визначення даних мають такий формат запису: ім’я псевдооператор вираз [,……]. В якості виразу найчастіше може бути константа. Псевдооператор DB резервує пам’ять об’ємом 1 байт. DW – об’ємом одне слово. DD – подвійне слово. DQ – 2пподвійні слова. DF – 6 байт. DT – 10 байт. Наприклад змінна xyz DW 2S – резервує для змінної ( ). Треба пам’ятати про макс. Vпмін. значення даних, які можуть бути розміщені у відведеній пам’яті в кожному з цих випадків, так наприклад: макс. значення байта без знака не може перевищувати 255, макс. значення байта зі знаком 127, а мін. – 128. Псевдооператори можна використовувати для створення в пам’яті таблиць, наприклад: А_ТАВ DB 3, 2, 4, 6, 8, 0, 0, 0
DB 5, 4, 2, 1
Такий псевдооператор DB резервує в пам’яті місце для 12 значень елементів таблиці А_ТАВ кожний розміром в байт. Можна вказувати довільну кількість елементів таблиці рядку, важливо, щоб вони помістились в 132 позиції рядка. В асемблері є операція DUP, яка дозволяє скорочувати задання таблиць у випадку однакових елементів. Даний псевдооператор можна записати так:
А_ТАВ DB 3, 2, 4, 6, 8, 3 DUP (0),
DB 5, 4, 2, 1
В пам’яті можна резервувати пам’ять для змінної, але конкретного значення їй не надавати. Для цього в полі виразу треба вказати знак питання. Приклад: X_1аDB ? X_2 DW ?. Такі псевдооператори резервують в пам’яті місце байту і слова, але початкового значення їм не надають. X_1аi X_2 при цьому не будуть містити ніяких специфічних значень, навіть (0). Можна зарезервувати в пам’яті місце для таблиці. Наприклад: А_ТАВ DB 12 DUP (3) резервує місце для таблиці з 12 елементів. Можна в якості значення змінної задавати рядок символів, для цього текст заключається в апострофи.
3. Псевдооператори визначення сегменту і процедури. Для визначення сегменту використовуються псевдооператори: SEGMENTаi ENDS. Це псевдооператори ділять вихідну програму на сегменти. Вони відповідно відмічають початок і кінець сегменту, але вини не повідомляють асемблер якого роду сегмент повинен бути визначений. Для цього використовується псевдооператор ASSUME, він має таку форму запису: ASSUME регістр сегмента: ім’я сегмента [,…….]. це регістр сегмента – це ім’я одного із сегментних регістрів CS, DS, SS, ES. Якщо П 80386 і вище то там ще буде FS, GS. Ім’я сегмента це ім’я яке вказується в псевдооператорі SEGMENT. Цей псевдооператор допомагає асемблеру перетворювати мітки в адреси, він повідомляє, яким регістром хочете скористяватися при адресації міток. Наприклад:ASSUMEDS: DSEG – означає, якщо при трансляції програми буде згадана мітка із сегмента DSEG, тобто регістр DS буде завжди вказувати на початок сегмента DSEG. Майже завжди його поміщають після псевдооператора SEGMENT. Зауважимо, що адресу початку сегменту потрібно явно завантажити в DS. Псевдооператори PROGі ENDP визначають початок і кінець процедури. Кожна процедура повинн0ппочинатись
Структура программы на ассемблереСинтаксис ассемблераСтандартные директивы сегментации Упрощенные директивы сегментации
Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы. Предложения ассемблера бывают четырех типов:
команды или инструкциипредставляющие собой символические аналоги машинных команд.
В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд микропроцессора; макрокоманды - оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями; директивы, являющиеся указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении; строки комментариев, содержащие любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.
Синтаксис ассемблера Предложения, составляющие программу, могут представлять собой синтаксическую конструкцию, соответствующую команде, макрокоманде, директиве или комментарию. Для того чтобы транслятор ассемблера мог распознать их, они должны формироваться по определенным синтаксическим правилам. Для этого лучше всего использовать формальное описание синтаксиса языка наподобие правил грамматики. Наиболее распространенные способы подобного описания языка программирования - синтаксические диаграммы и расширенные формы Бэкуса-Наура. Для практического использования более удобны синтаксические диаграммы. К примеру, синтаксис предложений ассемблера можно описать с помощью синтаксических диаграмм, показанных на следующих рисунках.
Рис. 1. Формат предложения ассемблера
Рис. 2. Формат директив
Рис. 3. Формат команд и макрокоманд
На этих рисунках:
имя метки - идентификатор, значением которого является адрес первого байта того предложения исходного текста программы, которое он обозначает; имя - идентификатор, отличающий данную директиву от других одноименных директив. В результате обработки ассемблером определенной директивы этому имени могут быть присвоены определенные характеристики; код операции (КОП) и директива - это мнемонические обозначения соответствующей машинной команды, макрокоманды или директивы транслятора; операнды - части команды, макрокоманды или директивы ассемблера, обозначающие объекты, над которыми производятся действия. Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов. Как использовать синтаксические диаграммы? Очень просто: для этого нужно всего лишь найти и затем пройти путь от входа диаграммы (слева) к ее выходу (направо). Если такой путь существует, то предложение или конструкция синтаксически правильны. Если такого пути нет, значит эту конструкцию компилятор не примет. При работе с синтаксическими диаграммами обращайте внимание на направление обхода, указываемое стрелками, так как среди путей могут быть и такие, по которым можно идти справа налево. По сути, синтаксические диаграммы отражают логику работы транслятора при разборе входных предложений программы.