|
Адресні і числові вирази в мові Асемблер
Адресним називається вираз, що обчислюється для отримання адреси пам'яті. Поодинокі змінні і мітки являють собою найпростіші адресні вирази. Числовим називається вираз, у результаті обчислення якого утворюється число. Приклад числового виразу в команді пересилання: MOV AX, 35*2+4 Кожен вираз складається з операторів і операндів. У виразі допускаються бінарні арифметичні оператори додавання (+), віднімання (-), множення (*), ділення (/), а також унарні оператори плюс і мінус. Крім того існують “буквені” оператори: MOD – обчислює остачу від ділення лівого операнда на правий; SHL – здійснює зсув вліво лівого операнда на число біт, що дорівнюють значенню правого операнда; SHR – здійснює зсув вправо правого операнда на число біт, що дорівнюють значенню лівого операнда. Арифметичні оператори повинні відокремлюватись від своїх операндів хоча б одним пропуском. Застосування арифметичних операторів додавання і віднімання підлягає таким правилам: - абсолютне число завжди можна додавати або віднімати від змінної, мітки, абсолютного чи переміщуваного числа; коли число додається до змінної (мітки), результатом буде змінна (мітка); - віднімання змінних і міток дозволяється тільки в тому випадку, якщо вони знаходяться в одному сегменті; - додавання змінних і міток не дозволяється; - дозволяється додавання одного базового й одного індексного регістрів, наприклад, [BX+SI]; абсолютні чи переміщувані числа можна додавати або віднімати від регістрів чи виразів, але регістри не можна віднімати від чисел. Оператори множення, ділення, зсуву й обчислення остачі можуть виконати дії тільки з явними числами. В Асемблері існують також логічні оператори (табл. 1) і оператори відношення (табл. 2), призначення яких таке ж, як в інших мовах програмування. Особливе призначення має оператор SHORT, який повідомляє транслятору про те, що для збереження остаточного значення виразу буде досить 1 байта. Як і в інших мовах програмування, вирази обчислюються зліва направо з врахуванням пріоритету операторів і наявності круглих дужок. Розглянуті вище оператори в порядку зростання старшинства упорядковуються таким чином: - оператор SHORT; - логічні оператори OR і XOR; - логічний оператор AND; - логічний оператор NOT; - оператори відношення; - оператори додавання і віднімання; - оператори множення, ділення, обчислення остачі і зміщення.
Таблиця 1 - Логічні оператори
Таблиця 2 - Оператори відношення
В Асемблері існують також оператори, що повертають значення (табл. 3) і оператори присвоєння атрибута (табл. 4), призначення яких буде розглянуто пізніше.
Таблиця 3 - Оператори, які повертають значення
Таблиця 4 - Оператори присвоєння атрибута
Директиви Асемблера Директиви Асемблера керують роботою транслятора, а не мікропроцесора, і, тому, на відміну від команд, більшість директив Асемблера не генерує об'єктного коду. Коротко розглянемо призначення найпоширеніших директив, що необхідні для написання найпростішої програми на Асемблері. Як вже відзначалося, програма на Асемблері складається з декількох логічних сегментів. Кожний з них повинний починатися з директиви SEGMENT і закінчуватися директивою ENDS. В першому рядку програми пишеться директива NAME, що присвоює внутрішнє ім'я об'єктному модулю, який формується в результаті трансляції вихідного модуля програми. Внутрішнє ім'я не пов'язане зі зовнішнім ім'ям файла, що містить програму. Щоб правильно генерувати машинні команди зі звертаннями до пам'яті, транслятору потрібна інформація про базові значення, завантажені у сегментні регістри. Інформація вмісту сегментних регістрів повідомляється в директиві ASSUME (припустити). Програми на Асемблері мають великі розміри, тому, її доцільно розбивати на невеликі модулі, що називаються процедурами. Процедура – це послідовність команд, що виконує якусь закінчену дію, наприклад, введення або виведення даних. Процедури в Асемблері за призначенням аналогічні процедурам у Паскалі чи функціям у Сі. За допомогою директиви PROС відзначається місце входження в процедуру, а директивою ENDP відзначається закінчення процедури. Існує два типи процедур: NEAR і FAR. Якщо зазначений тип NEAR (цей тип приймається за замовчуванням), процедура знаходиться в тому ж сегменті коду, в якому знаходяться всі команди, що викликають дану процедуру. Команда виклику процедури CALL містить мітку однієї з команд процедури; звичайно нею є перша команда процедури, але це необов'язково. Процедура обов'язково містить команду повернення RET, що передає керування в місце виклику процедури. Наприкінці всієї програми обов'язково повинна знаходиться директива END.
Режими адресації в мові Асемблера
При виконанні будь-якої програми процесор звертається до пам'яті, в якій зберігаються команди і дані. У командах перетворення даних визначаються адреси команд, які вказують місцезнаходження необхідних даних, а в командах передачі керування визначаються адреси команд, яким передається керування, тобто адреси переходів. Спосіб, або метод визначення в команді адреси операнда чи адреси переходу, називається режимом адресації або просто адресацією. Для сучасних процесорів розроблені більше двох десятків режимів адресації, більшість з яких реалізовані в мікропроцесорі який ми розглядаємо. Всі реалізовані режими адресації поділяються на групи: - регістрова адресація, - безпосередня адресація, - пряма адресація, - непряма регістрова адресація, - пряма адресація з базуванням, - пряма адресація з індексуванням, - пряма адресація з індексуванням і базуванням.
Система команд мікропроцесора Intel 8086 Систему команд мікропроцесора Intel 8086 утворюють більше 100 базових символічних команд. Оскільки багато команд допускають використання різноманітних режимів адресації, загальна кількість генерованих транслятором машинних команд може досягати кількох тисяч. Всі команди Асемблера зручно розбити на групи: пересилання даних, арифметичні, логічні, зсуву, передачі керування, переривання, керування мікропроцесором.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|