Слайд 2Синтаксис асемблера
Речення, що складають програму, можуть являти собою синтаксичну конструкцію, що
відповідає команді, макрокоманді, чи директиві коментарю. Для того щоб транслятор асемблера міг розпізнати їх, вони повинні формуватися по визначених синтаксичних правилах. Для цього найкраще використовувати формальний опис синтаксису мови на зразок правил граматики. Найбільш розповсюджені способи подібного опису мови програмування — синтаксичні діаграми і розширені форми Бекуса—Наура. Для практичного використання більш зручні синтаксичні діаграми. Приміром, синтаксис речень асемблера можна описати за допомогою синтаксичних діаграм, показаних на наступних малюнках.
Слайд 3Синтаксис асемблера
Формат речення асемблера
Слайд 4Синтаксис асемблера
Формат директив
Слайд 5Синтаксис асемблера
Формат команд и макрокоманд
Слайд 6Синтаксис асемблера
ім'я мітки — ідентифікатор, значенням якого є адреса першого байта
тієї Речення вихідного тексту програми, що він позначає;
ім'я — ідентифікатор, що відрізняє дану директиву від інших однойменних директив. У результаті обробки асемблером визначеної директиви цьому імені можуть бути привласнені визначені характеристики;
код операції (КОП) і директива — це мнемонічні позначення відповідної машинної команди, чи макрокоманди директиви транслятора;
операнди — частини команди, чи макрокоманди директиви асемблера, що позначають об'єкти, над якими виробляються дії. Операнди асемблера описуються виразами з числовими і текстовими константами, мітками й ідентифікаторами перемінних з використанням знаків операцій і деяких зарезервованих слів.
Слайд 7Синтаксис асемблера
Припустимими символами при написанні тексту програм є:
усі латинські букви:
A—Z, a—z. При цьому заголовні і малі літери вважаються еквівалентними;
цифри від 0 до 9;
знаки ?, @, $, _, &;
роздільники , . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^.
Речення асемблера формуються з лексем, що представляють собою синтаксично нероздільні послідовності припустимих символів мови, що мають зміст для транслятора.
Слайд 8Синтаксис асемблера
Лексемами є:
ідентифікатори — послідовності припустимих символів, що використовуються для
позначення таких об'єктів програми, як коди операцій, імена перемінних і назви міток. Правило запису ідентифікаторів полягає в наступному: ідентифікатор може складатися з одного чи декількох символів. Як символи можна використовувати букви латинського алфавіту, цифри і деякі спеціальні знаки — _, ?, $, @. Ідентифікатор не може починатися символом цифри. Довжина ідентифікатора може бути до 255 символів, хоча транслятор сприймає лише перші 32, а інші ігнорує. Регулювати довжину можливих ідентифікаторів можна з використанням опції командного рядка mv. Крім цього існує можливість указати транслятору на те, щоб він розрізняв прописні і малі літери або ігнорував їхнє розходження (що і робиться за замовчуванням). Для цього застосовуються опції командного рядка /mu, /ml, /mx;
ланцюг символів — послідовності символів, укладені в одинарних чи подвійних лапок;
цілі числа в одній з наступних систем числення: двійковій, десятковій, шістнадцятирічній.
Слайд 9Синтаксис асемблера
Ототожнення чисел при записі їх у програмах на асемблері виробляється
за визначеними правилами:
Десяткові числа не вимагають для свого ототожнення вказівки яких-небудь додаткових символів, наприклад 25 чи 139.
Для ототожнення у вихідному тексті програми двійкових чисел необхідно після запису нулів і одиниць, що входять у їхній склад, поставити латинське “b”, наприклад 10010101b.
шістнадцятирічні числа мають більше умовностей при своєму записі.
Слайд 10Синтаксис асемблера
Умовності при записі шістнадцятирічних чисел :
По-перше, вони складаються
з цифр 0...9, рядкових і прописних букв латинського алфавіту a, b, c, d, e, f чи A, B, C, D, E, F.
По-друге, у транслятора можуть виникнути труднощі з розпізнаванням шістнадцятирічних чисел через те, що вони можуть складатися як з одних цифр 0...9 (наприклад 190845), так і починатися з букви латинського алфавіту (наприклад ef15). Для того щоб "пояснити" транслятору, що дана лексема не є десятковим числом чи ідентифікатором, програміст повинний спеціальним чином виділяти шістнадцятирічне число. Для цього на кінці послідовності шістнадцятирічних цифр, що складають шістнадцятирічне число, записують латинську букву “h”. Це обов'язкова умова. Якщо шістнадцятирічне число починається з букви, то перед ним записується ведучий нуль: 0ef15h.
Слайд 11Синтаксис асемблера
Практично кожне речення містить опис об'єкта, над яким чи
за допомогою якого виконується деяка дія. Ці об'єкти називаються операндами.
ОПЕРАНДИ — це об'єкти (деякі значення, регістри чи комірки пам'яті), на які діють інструкції чи директиви, або це об'єкти, що чи визначають уточнюють дію інструкцій чи директив.
Операнди можуть комбінуватися з арифметичними, логічними, побітовими й атрибутивними операторами для розрахунку деякого значення чи визначення комірки пам'яті, на яку буде впливати дана команда чи директива.
Слайд 12Класифікація операндів
· постійні, чи безпосередні, операнди
· адресні операнди
· переміщувані операнди
· лічильник
адреси
· реєстровий операнд
· базовий і індексний операнди
· структурні операнди
Слайд 13Операнди
Постійні чи безпосередні операнди — число, рядок, чи ім'я вираження, що мають
деяке фіксоване значення. Ім'я не повинне бути переміщуваним, тобто залежати від адреси завантаження програми в пам'ять. Наприклад, воно може бути визначено операторами equ чи =.
num equ 5
imd = num-2
mov al,num ;еквівалентно mov al,5
;5 тут безпосередній операнд
add [si],imd ; imd=3 - безпосередній операнд
mov al,5 ;5 - безпосередній операнд
У даному фрагменті визначаються дві константи, що потім використовуються в якості безпосередніх операндів у командах пересилання mov і додавання add.
Слайд 14Адресні операнди
Адресні операнди — задають фізичне розташування операнда в пам'яті за
допомогою вказівки двох складових адрес: сегмента і зсуву
Слайд 15Адресні операнди
mov ax,0000h
mov ds,ax
mov ax,ds:0000h ;записати слово в
ax з області
;пам'яті по фізичній адресі 0000:0000
Тут третя команда mov має адресний операнд.
Слайд 16Переміщувані операнди
Переміщувані операнди — будь-які символьні імена, що представляють деякі адреси
пам'яті. Ці адреси можуть позначати місце розташування в пам'яті деяких інструкції (якщо операнд — мітка) чи даних (якщо операнд — ім'я області пам'яті в сегменті даних).
Переміщувані операнди відрізняються від адресних тим, що вони не прив'язані до конкретної адреси фізичної пам'яті. Сегментна складова адреси переміщуваного операнда невідома і буде визначена після завантаження програми в пам'ять для виконання.
Слайд 17Переміщувані операнди
data segment
mas_w dw 25 dup (0)
…
code segment
…
lea si,mas_w ;mas_w -
переміщуваний операнд
У цьому фрагменті mas_w — символьне ім'я, значенням якого є початкова адреса області пам'яті розміром 25 слів. Повна фізична адреса цієї області пам'яті буде відома тільки після завантаження програми в пам'ять для виконання.
Слайд 18Лічильник адреси
Лічильник адреси — специфічний вид операнда. Він позначається знаком $.
Специфіка цього операнда в тім, що коли транслятор замість нього поточне значення лічильника адреси. Значення лічильника адреси, чи, як його іноді називають, лічильника розміщення, являє собою зсув поточної машинної команди відносно початку сегмента коду. У форматі лістінгу лічильнику адреси відповідає другий чи третій стовпчик (у залежності від того, є присутнім чи ні в лістінгу стовпчик з рівнем вкладеності). Якщо взяти в якості приклад будь-який лістінг, то видно, що при обробці транслятором чергової команди асемблера лічильник адреси збільшується на довжину сформованої машинної команди. Важливо правильно розуміти цей момент.
Слайд 19Домашнє завдання
Проаналізувати використання наступних операндів:
Базовий і індексний
Структурний
Запису
Слайд 20Оператори
Типи операторів асемблера і синтаксичні правила формування виразів асемблера.
· Арифметичні оператори
· Оператори зсуву
· Оператори порівняння
· Логічні оператори
· Індексний оператор
· Оператор перевизначення типу
· Оператор перевизначення сегмента
· Оператор іменування типу структури
· Оператор одержання сегментної складової адреси виразу
· Оператор одержання зсуву виразу
Слайд 22Арифметичні оператори
Арифметичні оператори. До них відносяться:
унарні “+” і “–”;
бінарні
“+” і “–”;
множення “*”;
цілочисельного ділення “/”;
одержання залишку від ділення “mod”.
Слайд 23Арифметичні оператори
tab_size equ 50 ;розмір масиву в байтах
size_el equ 2 ;розмір
елементів
…
;обчислюється число елементів масиву і заноситься врегістр cx
mov cx,tab_size / size_el ;оператор “/”
Слайд 25Оператори зсуву
Оператори зсуву виконують зсув виразу на зазначену кількість розрядів
mask_b
equ 10111011
…
mov al,mask_b shr 3 ;al=00010111
Слайд 26Оператори порівняння
Оператори порівняння (повертають значення “істина” чи “неправда”) призначені для
формування логічних виразів. Логічне значення “істина” відповідає цифровій одиниці, а “неправда” — нулю. Наприклад,
tab_size equ 30 ;розмір таблиці
…
mov al,tab_size ge 50 ;завантаження розміру таблиці в al cmp al,0
;якщо tab_size < 50, то
je m1 ;перехід на m1
…
m1:
…
Слайд 27Оператори порівняння
У цьому прикладі якщо значення tab_size більше чи дорівнює
50, то результат у al дорівнює 0ffh, а якщо tab_size менше 50, то al дорівнює 00h. Команда cmp порівнює значення al з нулем і установлює відповідні прапори в flags/eflags. Команда je на основі аналізу цих прапорів передає чи не передає керування на мітку m1.
Слайд 29Логічні оператори
Логічні оператори виконують над виразами побітові операції. Вирази повинні бути
абсолютними, тобто такими, чисельне значення яких може бути обчислено транслятором. Наприклад:
flags equ 10010011
mov al,flags xor 01h ;al=10010010;пересилання в al поле flags з
;інвертованим правим бітом
Слайд 30Індексний оператор
Індексний оператор [ ]. Не дивуйтеся, але дужки теж є оператором,
і транслятор їхню наявність сприймає як вказівку скласти значення вираження_1 за цими дужками з вираження_2, взятим у дужки Наприклад,
mov ax,mas[si];пересилання слова за адресою mas+(si) у регістр ax
Слайд 31Оператор перевизначення типу
Оператор перевизначення типу ptr застосовується для перевизначення чи
уточнення типу чи мітки змінної, обумовленим виразом.
d_wrd dd 0
...
mov al,byte ptr d_wrd+1
;пересилання другого байта з подвійного слова
Слайд 32Оператор перевизначення сегмента
Змушує обчислювати фізичну адресу відносно конкретно заданої сегментної складової:
"ім'я сегментного регістра", "ім'я сегмента" з відповідної директиви SEGMENT чи "ім'я групи"
code
...
jmp met1 ;обхід обов'язковий, інакше поле іnd буде трактуватися
;як чергова команда
іnd db 5 ;опис поля даних у сегменті команд
met1:
...
mov al,cs:іnd ;перевизначення сегмента дозволяє працювати з
;даними, визначеними всередині сегмента коду
Слайд 33Оператор перевизначення сегмента
Слайд 34Оператори іменування типу структури одержання сегментної складової адреси виразу
Оператор іменування типу структури
. (крапка) також змушує транслятор робити визначені обчислення, якщо він зустрічається у виразі.
Оператор одержання сегментної складової адреси виразу seg повертає фізичну адресу сегмента для виразу, у якості якого можуть виступати мітка, змінна, ім'я сегмента, ім'я групи чи деяке символічне ім'я.
Слайд 35Оператор одержання зсуву виразу offset
Оператор одержання зсуву виразу offset дозволяє
одержати значення зсуву виразу у байтах відносно початку того сегмента, у якому вираз визначений.
. data
pole dw 5
...
.code
...
mov ax,seg pole
mov es,ax
mov dx,offset pole ;тепер у парі es:dx повна адреса pole
Слайд 36Директиви сегментації
Мікропроцесор має шість сегментних регістрів, за допомогою яких може одночасно
працювати:
с одним сегментом коду;
с одним сегментом стека;
с одним сегментом даних;
с трьома додатковими сегментами даних.
Слайд 38Операнди в директиві SEGMENT
Атрибут вирівнювання сегмента (тип вирівнювання) повідомляє розроблювачу про
те, що потрібно забезпечити розміщення початку сегмента на заданій границі.
BYTE — вирівнювання не виконується.
WORD — сегмент починається за адресою, що кратна двом
DWORD — сегмент починається за адресою, що кратна чотирьом
PARA — сегмент починається за адресою, що кратна 16
PAGE — сегмент починається за адресою, що кратна 256
MEMPAGE — сегмент починається за адресою, що кратна 4 КБ
За замовчуванням тип вирівнювання має значення PARA.
Слайд 39Операнди в директиві SEGMENT
Атрибут комбінування сегментів (комбінаторний тип) повідомляє розроблювачу ,
як потрібно комбінувати сегменти різних модулів, що мають те саме ім'я.
PRIVATE — сегмент не буде поєднуватися з іншими сегментами з тим же ім'ям поза даним модулем;
PUBLIC — розроблювач змушує з'єднати всі сегменти з однаковими іменами.
COMMON — розташовує всі сегменти із тим самим ім'ям за однією адресою.
AT xxxx — розташовує сегмент по абсолютній адресі параграфа
STACK — визначення сегмента стека. Змушує розроблювача з'єднати всі однойменні сегменти й обчислювати адреси в цих сегментах щодо регістра ss.
За замовчуванням атрибут комбінування приймає значення PRIVATE.
Слайд 40Операнди в директиві SEGMENT
Атрибут класу сегмента (тип класу) — це укладений
в лапки рядок, що допомагає розроблювачу визначити відповідний порядок проходження сегментів при збиранні програми із сегментів декількох модулів.
Атрибут розміру сегмента. Для процесорів сегменти можуть бути 16, 32 та 64-розрядними. Це впливає, насамперед, на розмір сегмента і порядок формування фізичної адреси усередині нього. Атрибут може приймати наступні значення:
USE16 — це означає, що сегмент допускає 16-розрядну адресацію. При формуванні фізичної адреси може використовуватися тільки 16-розрядний зсув. Відповідно, такий сегмент може містити до 64 Кбайт коду чи даних;
USE32 — сегмент буде 32-розрядним. При формування фізичної адреси може використовуватися 32-розрядний зсув. Тому такий сегмент може містити до 4 Гбайт коди чи даних.
Слайд 41Директива MODEL
Обов'язковим параметром директиви MODEL є модель пам'яті. Цей параметр визначає
модель сегментації пам'яті для програмного модуля. Передбачається, що програмний модуль може мати тільки визначені типи сегментів, що визначаються згаданими нами раніше спрощеними директивами опису сегментів.
Слайд 42Спрощені директиви визначення сегмента
Слайд 43Директива MODEL
При використанні директиви MODEL транслятор робить доступними кілька ідентифікаторів, до
яких можна звертатися під час роботи програми, для того, щоб одержати інформацію про ті чи інші характеристики даної моделі пам'яті