Команди для роботи зі склом мови асемблер. Реферат: План: Передмова. Мова асемблера та структура команд. Структура exe-файлу (семантичний розбір). Оперативна пам'ять, регістри, подання даних

Вступ.

Мова, якою написана вихідна програма, називається вхідниммовою, а мова, якою вона перекладається для виконання процесором, - вихідниммовою. Процес перетворення вхідної мови у вихідну мову називається трансляцією.Так як процесори здатні виконувати програми на машинній мові двійкових кодів, який не використовується для програмування, то необхідна трансляція всіх вихідних програм. Відомі два способитрансляції: компіляція та інтерпретація.

При компіляціївихідна програма спочатку повністю перекладається в еквівалентну програму вихідною мовою, звану об'єктноїпрограмою, а потім виконується. Цей процес реалізується за допомогою спеціальної програми,званою компілятором.Компілятор, для якого вхідна мова є символічною формою представлення машинної (вихідної) мови двійкових кодів, називається асемблером.

При інтерпретаціїкожен рядок тексту вихідної програми аналізується (інтерпретується) і вказана команда відразу виконується. Реалізація такого способу покладається на програму-інтерпретатор.Інтерпретація займає тривалий час. Для підвищення її ефективності замість обробки кожного рядка інтерпретатор попередньо здійснює перетворення всіх команднихрядків у символи (

). Сформована послідовність символів використовується для виконання покладених на вихідну програму функцій.

Розглянута нижче мова асемблера реалізується за допомогою компіляції.

Особливості мови.

Основні особливості асемблера:

● замість двійкових кодів у мові використовуються символьні імена - мнемо-ніка.Наприклад, для команди додавання (

) використовується мнемоніка

Віднімання (

множення (

Поділу (

і т. д. Символьні імена використовуються для адресації осередків пам'яті. Для програмування на мові асемблера замість двійкових кодів і адрес потрібно знати тільки символічні назви, які асемблер транслює в двійкові коди;

кожне висловлювання відповідає одній машинній команді(коду), т. е. існує взаємно однозначне відповідність між машинними командами та операторами в програмі мовою асемблера;

● мова забезпечує доступ до всіх об'єктівта командам. Мови високого рівня такої здатності не мають. Наприклад, мова асемблера дозволяє виконати перевірку біта регістру прапорів, а мова високого рівня (наприклад,

) такої здатністю не має. Зазначимо, що мови для системного програмування (наприклад, С) часто займають проміжне положення. З точки зору можливостей доступу вони ближче до мови асемблера, однак мають синтаксис мови високого рівня;

● мова асемблера не є універсальною мовою.Для кожної певної групи мікропроцесорів є свій асемблер. Мови високого рівня позбавлені цього недоліку.

На відміну від мов високого рівня написання та налагодження програми на мові асемблера займає багато часу. Незважаючи на це, мова асемблера отримав широке розповсюдженнячерез такі обставини:

● складена мовою асемблера програма має значно менші розміри та працює набагато швидше, ніж програма, написана мовою високого рівня. Для деяких додатків ці показники відіграють першорядну роль, наприклад, багато системних програм (у тому числі компілятори), програми в кредитних картках, стільникових телефонах, драйверах пристроїв та ін;

● деяким процедурам потрібен повний доступ до апаратного забезпечення, що зазвичай неможливо здійснити мовою високого рівня. До цього випадку відносяться переривання та обробники переривань в операційних системах, а також контролери пристроїв у вбудованих системах, що працюють у режимі реального часу.

У більшості програм лише невеликий відсоток всього коду відповідає за відсоток часу виконання програми. Зазвичай 1% програми відповідає за 50% часу виконання, а 10% програми відповідає за 90% часу виконання. Тому для написання конкретної програми в реальних умовах використовується як асемблер, так і одна з мов високого рівня.

Формат оператора у мові асемблера.

Програма мовою асемблера є список команд (висловлювань, речень), кожна з яких займає окремий рядок і містить чотири поля: поле мітки, поле операції, поле операндів і поле коментарів. Для кожного поля відводиться окрема колонка.

Полі етикетці.

Для поля мітки відводиться колонка 1. Мітка є символічним ім'ям, або ідентифікатором, адресипам'яті. Вона потрібна для того, щоб можна було:

● зробити умовний або безумовний перехід до команди;

● отримати доступ до місця, де зберігаються дані.

Такі висловлювання мають мітку. Для позначення імені використовуються (великі) літери англійського алфавіту та цифри. На початку імені має стояти буква, наприкінці - роздільник у вигляді двокрапки. Мітку з двокрапкою можна писати на окремому рядку, а код операції - на наступному рядку в колонці 2, що спрощує роботу компілятора. Відсутність двокрапки не дозволяє відрізнити мітку від коду операції, якщо вони розташовані на окремих рядках.

У деяких версіях мови асемблера двокрапки ставляться лише після міток команд, але не після міток даних, а довжина мітки може бути обмежена 6 або 8 символами.

У полі мітки не повинно зустрічатися однакових імен, так як мітка асоціюється з адресами команд. Якщо в процесі виконання програми відсутня необхідність виклику команди або даних із пам'яті, поле мітки залишається порожнім.

Поле код операції.

Це поле містить мнемокод команди або псевдо-команди (див. нижче). Мнемокод команд вибирається розробниками мови. У мові асемблера

для завантаження регістру з пам'яті вибрана мнемоніка

), а збереження вмісту регістру у пам'яті - мнемоника

). У мовах асемблера

для обох операцій можна використовувати одне ім'я, відповідно

Якщо вибір назв мнемонік може бути довільним, то необхідність використання двох машинних команд обумовлено архітектурою процесорів

Мнемоніка регістрів також залежить від версії асемблера (табл. 5.2.1).

Поле операнди.

Тут розташовується додаткова інформація, необхідна до виконання операції. У полі операндів для команд переходу вказана адреса, куди потрібно здійснити перехід, а також задані адреси та регістри, які є операндами для машинної команди. Як приклад наведемо операнди, які можуть бути використані для 8-розрядних процесорів

● числові дані,

представлені у різних системах числення. Для позначення використовуваної системи числення за константою слід одна з латинських літер:

Відповідно двійкова, вісімкова, шістнадцяткова, десяткова системи числення (

можна не записувати). Якщо першою цифрою шістнадцяткового числа є А, В, С,

То попереду додається незначний 0 (нуль);

● коди внутрішніх регістрів мікропроцесора та комірки пам'яті

М (джерел або приймачів інформації) у вигляді букв А, В, С,

М або їх адреси в будь-якій системі числення (наприклад, 10В - адреса регістру

у двійковій системі);

● ідентифікатори,

для реєстрових пар ЗС,

Перші літери,

Н; для пари акумулятора та регістру ознак -

; для лічильника команд -

;для покажчика стека -

● мітки, що вказують адреси операндів або наступних команд до умовних

(при виконанні умови) та безумовних переходах.Наприклад, операнд М1 у команді

означає необхідність безумовного переходу до команди, адреса якої в полі мітки відзначений ідентифікатором М1;

● вирази,

які будуються шляхом зв'язування розглянутих вище даних за допомогою арифметичних та логічних операторів. Зазначимо, що спосіб резервування простору даних залежить від версії мови. Розробники мови асемблера для

Визначити слово), а згодом запровадили альтернативний варіант.

який із самого початку був у мові для процесорів

У версії мови

використовується

Визначити константу).

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

II регістри різної довжини мають різні назви: ЕАХ - для розміщення 32-бітних операндів (тип

); АХ - для 16-бітних (тип

та АН - для 8-бітних (тип

● для процесорів

до кожного коду операції додаються суфікси: суфікс

Для типу

; суфікс «.В» для типу

для операндів різної довжини використовуються різні коди операцій, наприклад, для завантаження байта, напівслова (

) і слова в 64-бітний реєстр використовуються коди операцій

відповідно.

Поле коментарів.

У цьому полі наводяться пояснення про дії програми. Коментарі не впливають на роботу програми та призначені людині. Вони можуть знадобитися для модифікації програми, яка без таких коментарів може бути абсолютно незрозумілою навіть досвідченим програмістам. Коментар починається з символу і використовується для пояснення та документування програм. Початковим символом коментаря можуть бути:

● точка з комою (;) у мовах для процесорів фірми

знак оклику(!) у мовах для

Кожен окремий рядок, відведений під коментар, передує початковому символу.

Псевдокоманди (директиви).

У мові асемблера можна назвати два основних види команд:

базовікоманди є еквівалентом машинного коду процесора. Ці команди виконують всю передбачену програмою обробку;

псевдокоманди,або директиви,призначені для обслуговування процесу трансляції програми на мову кодових комбінацій. Як приклад у табл. 5.2.2 наведено деякі псевдокоманди з ас-семблера

для сімейства

.

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

● писати потрібну послідовність команд щоразу, коли вона зустрічається. Такий підхід призводить до збільшення обсягу програми;

● оформити цю послідовність у процедуру (підпрограму) та викликати її за потреби. Такий вихід має свої недоліки: щоразу доведеться виконувати спеціальну команду виклику процедури і команду повернення, що при короткій і часто використовуваній послідовності може сильно знизити швидкість роботи програми.

Найбільш простий та ефективний спосіб багаторазового повторення ланцюжка команд полягає у використанні макросу,який можна представити як псевдо-команду, призначену для повторної трансляції часто зустрічається в програмі групи команд.

Макрос, або макрокоманда, характеризується трьома аспектами: макровизначенням, макрозверненням та макророзширенням.

Макровизначення

Це позначення багаторазово повторюваної послідовності команд програми, що використовується для посилань у тексті програми.

Макровизначення має таку структуру:

Список виразів; Макровизначення

У наведеній структурі макровизначення можна виділити три частини:

● заголовок

макросу, що включає в себе ім'я

Псевдокоманду

та набір параметрів;

● позначене точками тіломакросу;

● команда

закінчення

макровизначення.

Набір параметрів макровизначення містить список всіх параметрів, наведених у полі операнда для вибраної групи команд. Якщо ці параметри наведені у програмі раніше, то їх у заголовку макровизначення можна не вказувати.

Для повторного асемблювання обраної групи команд використовується звернення, що складається з імені

макрокоманди та переліку параметрів з іншими значеннями.

Коли процесі компіляції асемблер зустрічає макровизначення, він зберігає їх у таблиці макроопределений. При наступних появах у програмі імені (

) макросу асемблер замінює його тілом макросу.

Використання імені макросу як код операції називається макро-зверненням(макровизовом), яке заміщення тілом макросу - макророзширенням.

Якщо програму представити як послідовність символів (літер, цифр, пробілів, знаків пунктуації та повернення каретки для переходу на новий рядок), то макророзширення полягає у заміні одних ланцюжків з цієї послідовності іншими ланцюжками.

Макророзширення відбувається під час асемблювання, а не під час виконання програми. Способи маніпулювання ланцюжками символів покладається на макрозасоби.

Процес асемблювання здійснюється у два проходи:

● на першому проході зберігаються всі макровизначення, а макродзвінки розширюються. При цьому вихідна програма зчитується і перетворюється на програму, в якій видалені всі макровизначення, а кожен макровиклик заміщений тілом макросу;

● на другому проході обробляється отримана програма без макросів.

Макроси з параметрами.

Для роботи з послідовностями команд, що повторюються, параметри яких можуть приймати різні значення, передбачені макровизначення:

● з фактичнимипараметрами, що містяться в полі операндів макрозвернення;

● з формальнимипараметрами. У процесі розширення макросу кожен формальний параметр, що з'являється в тілі макросу, заміщається відповідним фактичним параметром.

використання макросів із параметрами.

У програмі 1 наведено дві схожі послідовності команд, що відрізняються тим, що перша з них міняє місцями Р і

А друга

У програмі 2 включений макрос із двома формальними параметрами Р1 та Р2. Під час розширення макросу кожен символ Р1 всередині тіла макросу заміщається першим фактичним параметром (Р,

), а символ Р2 заміщається другим фактичним параметром (

) з програми № 1. У макровизові

програми 2 позначено: Р,

Перший фактичний параметр

Другий фактичний параметр.

Програма 1

Програма 2

MOV EBX, Q MOV EAX, Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Розширені можливості.

Розглянемо деякі розширені можливості мови

Якщо макрос, що містить команду умовного переходу і мітку, до якої відбувається перехід, викликається два і більше разів, то мітка буде дублюватися (проблема дублювання міток), що викликає помилку. Тому при кожному виклику як параметр приписується (програмістом) окрема мітка. У мові

мітка оголошується локальною (

) і завдяки розширеним можливостям асемблер автоматично породжує іншу мітку при кожному розширенні макросу.

дозволяє визначати макроси усередині інших макросів. Така розширена можливість дуже корисна у поєднанні з умовним компонуванням програми. Розглянемо

IF WORDSIZE GT 16 M2 MACRO

Макрос М2 може бути визначений в обох частинах оператора

Проте визначення залежить від цього, якому процесорі асемблируется програма: на 16–битном чи 32–битном. Якщо М1 не викликається, то макрос М2 взагалі не буде визначено.

Ще одна розширена можливість полягає в тому, що макроси можуть викликати інші макроси, у тому числі самих себе - рекурсивнийвиклик. В останньому випадку, щоб не вийшов нескінченний цикл, макрос повинен передавати самому собі параметр, який змінюється при кожному розширенні, а також перевіритицей параметр і завершує рекурсію, коли параметр досягає певного значення.

Про використання макрозасобів в асемблері.

При використанні мак-росів асемблер повинен вміти виконувати дві функції: зберігати макровизначенняі розширювати макровиклики.

Збереження макровизначень.

Всі імена макросів зберігаються в таблиці. Кожне ім'я супроводжується вказівником на відповідний макрос, щоб у разі необхідності його можна було викликати. Одні асемблери мають окрему таблицю для імен макросів, інші - загальну таблицю, в якій наряду з іменами макросів знаходяться всі машинні команди та директиви.

При зустрічі з макросом у процесі асемблювання створюється:

новий елементтаблиціз ім'ям макросу, числом параметрів та вказівником на іншу таблицю макровизначень, де зберігатиметься тіло макросу;

● список формальнихпараметрів.

Потім зчитується і зберігається в таблиці макровизначень тіло макросу, що є просто ланцюжком символів. Формальні параметри, які у тілі циклу, позначаються спеціальним символом.

Внутрішнє уявлення макросу

із наведеного вище прикладу для програми 2 (стор. 244) має вигляд:

MOV EAX, MOV EBX, MOV MOV &

де в якості символу повернення каретки використовується крапка з комою, а в якості символу формального параметра - амперсант &.

Розширення макровикликів.

Щоразу, коли при асемблюванні зустрічається макровизначення, воно зберігається в таблиці макросів. При виклику макросу асемблер тимчасово зупиняє читання вхідних даних із вхідного пристрою і починає зчитувати збережене тіло макросу. Вилучені з тіла макросу формальні параметри заміщаються фактичними параметрами і надаються викликом. Амперсант & перед параметрами дозволяє асемблеру розпізнати їх.

Незважаючи на те, що існує багато версій асемблера, процеси асемблювання мають спільні риси і багато в чому подібні. Нижче розглядається робота двопрохідного асемблера.

Двопрохідний асемблер.

Програма складається з низки операторів. Тому, здавалося б, що при асемблюванні можна використовувати наступну послідовність дій:

● транслювати його машинною мовою;

● перенести отриманий машинний код у файл, а відповідну частину листівки - в інший файл;

● повторювати перелічені процедури до тих пір, поки вся програма не буде відтрансльована.

Однак такий підхід не є ефективним. Прикладом може бути так звана проблема випереджального посилання.Якщо першим оператором є перехід до оператора Р, розташованому в самому кінці програми, асемблер не може транслювати його. Він спочатку повинен визначити адресу оператора Р, а для цього потрібно прочитати всю програму. Кожне повне прочитання вихідної програми називається проходом.Покажемо, як можна вирішити проблему випереджального посилання з використанням двох проходів:

на першому проході слідує зібратита зберегти в таблиці всі визначення символів (у тому числі міток), а на другому проході - виконати читання та асемблювання кожного оператора. Такий спосіб відносно простий, однак другий прохід за програмою вимагає додаткових тимчасових витрат на операції введення-виводу;

● на першому проході слідує перетворитипрограму в проміжну форму і зберегти її в таблиці, а другий прохід виконати не за вихідною програмою, а по таблиці. Такий спосіб асемблювання дозволяє заощадити час, тому що на другому проході не виконуються операції введення-виводу.

Перший прохід.

Ціль першого проходу- Побудувати таблицю символів. Як зазначалося вище, ще одним завданням першого проходу є збереження всіх макровизначень та розширення викликів у міру їхньої появи. Отже, в одному проході відбувається визначення символів, і розширення макросів. Символом може бути або мітка,або значення,якому за допомогою директиви приписується певне ім'я:

;Значення - розмір буфера

Надаючи значення символьним іменам у полі мітки команд, асемблер по суті задає адреси, які матиме кожна команда під час виконання програми. Для цього асемблер під час процесу асемблювання зберігає лічильник адреси команд(

) як спеціальну змінну. На початку першого проходу значення спеціальної змінної встановлюється на 0 та збільшується після кожної обробленої команди на довжину цієї команди. Як приклад у табл. 5.2.3 наведено фрагмент програми з зазначенням довжини команд і значень лічильника. При першому проході формуються таблиці символьних імен, директиві кодів операцій,а при необхідності літеральнатаблиці. Літерал – це константа, для якої асемблер автоматично резервує пам'ять. Відразу ж зазначимо, що сучасні процесоримістять команди з безпосередніми адресами, тому їх ас-семблери не підтримують літерали.

Таблиця символьних імен

містить один елемент для кожного імені (табл. 5.2.4). У кожному елементі таблиці символьних імен міститься саме ім'я (або покажчик на нього), його чисельне значення і іноді деяка додаткова інформація, яка може включати:

● довжину поля даних, пов'язаного із символом;

● біти перерозподілу пам'яті (які показують, чи змінюється значення символу, якщо програма завантажується не в тій адресі, в якій припускав асемблер);

● відомості про те, чи можна отримати доступ до символу ззовні процедури.

Символьні імена є мітками. Вони можуть бути задані за допомогою операторів (наприклад,

Таблиця директив.

У цій таблиці наводяться всі директиви або псевдо-команди, які зустрічаються при асемблюванні програми.

Таблиця кодів операцій.

Для кожного коду операції в таблиці передбачені окремі графи: позначення коду операції, операнд 1, операнд 2, 16-річне значення коду операції, довжина команди та тип команди (табл. 5.2.5). Коди операцій діляться на групи залежно від кількості та виду операндів. Тип команди визначає номер групи і визначає процедуру, яка викликається для обробки всіх команд даної групи.

Другий прохід.

Мета другого проходу- створення об'єктної програми та роздруківка за необхідності протоколу асемблювання; висновок інформації, необхідної компоновщику для зв'язування процедур, які асемблювалися в різний час, в один файл, що виконується.

При другому проході (як і при першому) рядки, що містять оператори, зчитуються та обробляються один за одним. Вихідний оператор та отриманий з нього у шістнадцятковій системі вихідний об'єктнийкод можна надрукувати або помістити в буфер для наступного друку. Після переустановки лічильника адреси команди викликається наступний оператор.

Вихідна програмаможе містити помилки, наприклад:

наведений символ не визначено або визначено більше одного разу;

● код операції представлений неприпустимим ім'ям (через помилки), не забезпечений достатньою кількістю операндів або має занадто багато операндів;

● відсутній оператор

Деякі асемблери можуть виявити невизначений символ та замінити його. Однак у більшості випадків при виявленні оператора з помилкою асемблер виводить повідомлення про помилку на екран і намагається продовжити процес асемблювання.

Статті присвяченої мові асемблер.

Загальні відомості про мову асемблера

Символічна мова асемблера дозволяє значною мірою усунути недоліки програмування машинною мовою.

Головною його перевагою є те, що мовою асемблера всі елементи програми представлені у символічній формі. Перетворення символічних імен команд у їхні двійкові коди покладаються на спеціальну програму- асемблер, яка звільняє програміста від трудомісткої роботи та виключає неминучі у своїй помилки.

Символічні імена, що вводяться при програмуванні мовою асемблера, зазвичай відбивають семантику програми, а абревіатура команд - їх основну функцію. Наприклад: PARAM – параметр, TABLE – таблиця, MASK – маска, ADD – додавання, SUB – віднімання тощо. п. Такі імена легко запам'ятовуються програмістом.

Для програмування мовою асемблера необхідно мати складні інструментальні засоби, ніж при програмуванні машинною мовою: потрібні обчислювальні комплекси на базі мікро - ЕОМ або ПЕОМ з комплектом периферійних пристроїв (алфавітно-цифрова клавіатура, символьний дисплей, НГМД та друкувальний пристрій), а також резидент чи крос-системи програмування для необхідних типів мікропроцесорів. Мова асемблера дозволяє ефективно писати та налагоджувати значно складніші програми, ніж машинна мова (до 1 – 4 Кбайт).

Мови асемблера є машинно-орієнтованими, тобто залежними від машинної мови та структури відповідного мікропроцесора, тому що в них кожній команді мікропроцесора надається певне символічне ім'я.

Мови асемблера забезпечують істотне підвищення продуктивність праці програмістів проти машинними мовами й те водночас зберігають можливість використовувати всі програмно-доступні апаратні ресурси мікропроцесора. Це дає можливість кваліфікованим програмістам складати програми, що виконуються за короткий час і займають менший обсяг пам'яті порівняно з програмами, що створюються мовою високого рівня.

У зв'язку з цим практично всі програми управління пристроями вводу/виводу (драйвери) пишуться мовою асемблера, не дивлячись на наявність досить великої номенклатури мов високого рівня.

За допомогою мови асемблера програміст може задати такі параметри:

мнемоніку (символічне ім'я) кожної команди машинної мови мікропроцесора;

стандартний формат для рядків програми, що описується на асемблері;

формат для вказівки різних способівадресації та варіантів команд;

формат для вказівки символьних констант та констант цілого типу в різних системах числення;

псевдокоманди, що управляють процесом асемблювання (трансляції) програми.

На мові асемблера програма записується рядково, т. е. кожної команди відводиться один рядок.

Для мікро - ЕОМ, побудованих на базі найбільш поширених типів мікропроцесорів, може існувати кілька варіантів мови асемблера, проте практичне поширення зазвичай має один - це так звана стандартна мова асемблера

Програмування лише на рівні машинних команд - це мінімальний рівень, у якому можливе складання програм. Система машинних команд має бути достатньою для того, щоб реалізувати необхідні дії, видаючи вказівки апаратури обчислювальної машини.

Кожна машинна команда складається із двох частин:

· Операційної - визначальною, "що робити";

· Операндний - визначальною об'єкти обробки, "з чим робити".

Машинна команда мікропроцесора, записана мовою асемблера, є одним рядком, що має наступний синтакічний вигляд:

мітка команда/директива операнд(и) ;коментарі

При цьому обов'язковим полем у рядку є команда чи директива.

Мітка, команда/директива та операнди (якщо є) поділяються принаймні одним символом пробілу або табуляції.

Якщо команду або директиву необхідно продовжити на наступному рядку, використовується символ зворотний слєш: \.

За замовчуванням мова асемблера не розрізняє великі та малі літери в написанні команд або директив.

Пряма адресація: ефективна адреса визначається безпосередньо полем усунення машинної команди, яке може мати розмір 8, 16 або 32 біти.

mov eax, sum; eax = sum

Асемблер замінює sum на відповідну адресу, що зберігається в сегменті даних (за умовчанням адресується регістром ds) і значення, що зберігається за адресою sum, поміщає регістр eax.

Непряма адресаціяу свою чергу має такі види:

· Непряма базова (реєстрова) адресація;

· Непряма базова (реєстрова) адресація зі зміщенням;

· Непряма індексна адресація;

· Непряма базова індексна адресація.

Непряма базова (реєстрова) адресація.При такій адресації ефективна адреса операнда може знаходитись у будь-якому з регістрів загального призначення, крім sp/esp та bp/ebp (це специфічні регістри для роботи з сегментом стека). Синтаксично у команді цей режим адресації виражається укладанням імені регістру в квадратні дужки.

mov eax, ; eax = * esi; *esi значення за адресою esi

Структура команди мовою асемблера Програмування лише на рівні машинних команд - це мінімальний рівень, у якому можливе програмування комп'ютера. Система машинних команд має бути достатньою для того, щоб реалізувати необхідні дії, видаючи вказівки апаратури машини. Кожна машинна команда складається з двох частин: операційної, що визначає "що робити" і операндної, що визначає об'єкти обробки, тобто "над чим робити". Машинна команда мікропроцесора, записана на мовою Асемблераявляє собою один рядок, що має наступний вигляд: мітка команда/директива операнд(и); коментарі Мітка, команда/директива та операнд поділяються принаймні одним символом пробілу або табуляції. Операнди команди розділяються комами.

Структура команди мовою асемблера Команда асемблера вказує транслятору, яку дію має виконувати мікропроцесор. Директиви асемблера - параметри, задані у тексті програми, що впливають процес асемблирования чи властивості вихідного файла. Операнд визначає початкове значення даних (у сегменті даних) або елементи, над якими виконується дія за командою (сегмент коду). Команда може мати один або два операнди, або не мати операндів. Число операндів неявно задається кодом команди. Якщо команду або директиву необхідно продовжити на наступному рядку, використовується символ «зворотний сліш»: «» . За замовчуванням Ассемблер не розрізняє великі та малі літери у написанні команд і директив. Приклади директиви та команди Count db 1; Ім'я, директива, один операнд mov eax, 0; Команда, два операнди

Ідентифікатори – послідовності допустимих символів, що використовуються для позначення імен змінних та назв міток. Ідентифікатор може складатися з одного або кількох таких символів: всі літери латинського алфавіту; цифри від 0 до 9; спецсимволи: _, @, $, ? . Як перший символ мітки може використовуватися точка. Як ідентифікатори не можна використовувати зарезервовані імена асемблера (директиви, оператори, імена команд). Першим символом ідентифікатора має бути буква або спецсимвол. Максимальна довжина ідентифікатора 255 символів, але транслятор приймає перші 32, інші ігнорує. Усі мітки, які записуються в рядку, що не містить директиви асемблера, повинні закінчуватися двокрапкою «:». Мітка, команда (директива) та операнд не обов'язково повинні починатися з певної позиції в рядку. Рекомендується записувати їх в колонку для більшої добованості програми.

Мітки Усі мітки, які записуються в рядку, що не містить директиви асемблера, повинні закінчуватися двокрапкою «:». Мітка, команда (директива) та операнд не обов'язково повинні починатися з певної позиції в рядку. Рекомендується записувати їх в колонку для більшої добованості програми.

Коментарі Використання коментарів у програмі покращує її ясність, особливо там, де призначення набору команд є незрозумілим. Коментарі починаються на будь-якому рядку вихідного модуля із символу «точка з комою» (;). Усі символи, що знаходяться праворуч від “; » до кінця рядка є коментарем. Коментар може містити будь-які друковані символи, включаючи пробіл . Коментар може займати весь рядок або слідувати за командою на тому ж рядку.

Структура програми на мові асемблера Програма, написана на мові асемблера, може складатися з кількох частин, які називаються модулями, у кожному з яких можуть бути визначені один або кілька сегментів даних, стека та коду. Будь-яка закінчена програма мовою асемблері повинна включати один головний, або основний модуль, з якого починається її виконання. Модуль може містити програмні сегменти, сегменти даних та стека, оголошені за допомогою відповідних директив.

Моделі пам'яті Перед оголошенням сегментів необхідно вказати модель пам'яті за допомогою директиви. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Основні моделі пам'яті мови асемблера: Модель пам'яті Адресація коду Адресація даних Операційна системаЧергування коду та даних TINY NEAR MS-DOS Допустимо SMALL NEAR MS-DOS, Windows Немає MEDIUM FAR NEAR MS-DOS, Windows Немає COMPACT NEAR FAR MS-DOS, Windows Ні LARGE FAR MS-DOS, Windows Ні HUGE FAR MS-DOS, Windows Немає NEAR Windows 2000, Windows XP, Windows Допустимо FLAT NEAR NT,

Моделі пам'яті Модель tiny працює тільки в 16-розрядних програмах MS-DOS. У цій моделі всі дані та код розташовуються в одному фізичному сегменті. Розмір програмного файлуу разі не перевищує 64 Кбайт. Модель small підтримує один сегмент коду та один сегмент даних. Дані та код при використанні цієї моделі адресуються як near (ближні). Модель medium підтримує кілька сегментів програмного коду і один сегмент даних, причому всі посилання в сегментах програмного коду за умовчанням вважаються далекими (far), а посилання в сегменті даних - ближніми (near). Модель compact підтримує кілька сегментів даних, у яких використовується дальня адресація даних (far), та один сегмент коду з ближньою адресацією (near). Модель large підтримує кілька сегментів коду та кілька сегментів даних. За замовчуванням усі посилання на код та дані вважаються далекими (far). Модель huge практично еквівалентна моделі пам'яті large.

Моделі пам'яті Модель flat передбачає несегментовану конфігурацію програми і використовується лише в 32-розрядних операційних системах. Ця модель подібна до моделі tiny в тому сенсі, що дані і код розміщені в одному сегменті, тільки 32-розрядному. Для розробки програми моделі flat перед директивою. model flat слід розмістити одну з директив: . 386, . 486, . 586 або. 686. Вибір директиви вибору процесора визначає набір команд, доступних під час написання програм. Літера p після директиви вибору процесора означає захищений режим роботи. Адресація даних та коду є ближньою (near), при цьому всі адреси та покажчики є 32-розрядними.

Моделі пам'яті. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Параметр модифікатор використовується для визначення типів сегментів і може приймати значення: use 16 (сегменти вибраної моделі використовуються як 16-бітні) use 32 (сегменти вибраної моделі використовуються як 32-бітові). Параметр угода_про_дзвінки використовується для визначення способу передачі параметрів при виклику процедури з інших мов, у тому числі і високого рівня (C++, Pascal). Параметр може приймати такі значення: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Моделі пам'яті. MODEL модифікатор модель_пам'яті, угода_про_дзвінки, тип_ОС, параметр_стека Параметр тип_ОС дорівнює OS_DOS за замовчуванням, і на Наразіце єдине значення цього параметра, що підтримується. Параметр параметр_стека встановлюється рівним: NEARSTACK (реєстр SS дорівнює DS, області даних і стека розміщуються в тому самому фізичному сегменті) FARSTACK (реєстр SS не дорівнює DS, області даних і стека розміщуються в різних фізичних сегментах). За замовчуванням приймається NEARSTACK.

Приклад програми, що «нічого не робить». 686 P. MODEL FLAT, STDCALL. DATA. CODE START: RET END START RET – команда мікропроцесора. Вона забезпечує правильне закінчення роботи програми. Решта програми належить до роботи транслятора. . 686 P – дозволені команди захищеного режиму Pentium 6 (Pentium II). Ця директива вибирає підтримуваний набір команд асемблера, вказуючи модель процесора. . MODEL FLAT, stdcall – плоска модель пам'яті. Ця модель пам'яті використовується в операційній системі Windows. stdcall - угода про виклики процедур, що використовується.

Приклад програми, що «нічого не робить». 686 P. MODEL FLAT, STDCALL. DATA. CODE START: RET END START . DATA – сегмент програми, що містить дані. Ця програмане використовує стек, тому сегмент. STACK відсутня. . CODE – сегмент програми, що містить код. START – мітка. END START - кінець програми та повідомлення компілятору, що починати виконання програми треба з мітки START. Кожна програма повинна містити директиву END, що позначає кінець вихідного кодупрограми. Усі рядки, які слідують за директивою END, ігноруються Мітка, вказана після директиви END, повідомляє транслятор ім'я головного модуля, з якого починається виконання програми. Якщо програма містить один модуль, мітку після директиви END можна не вказувати.

Транслятори мови асемблера Транслятор - програма або технічний засіб, що виконує перетворення програми, представленої однією з мов програмування, програму цільовою мовою, звану об'єктним кодом. Крім підтримки мнемонік машинних команд, кожен транслятор має власний набір директив і макрозасобів, часто ні з чим не сумісних. Основні види трансляторів мови асемблера: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - багатопрохідний асемблер, що вільно розповсюджується, написаний Томашем Гриштаром (польськ.), NASM (Netwide Assembler) - вільний 86, був створений Саймон Тетхем спільно з Юліаном Холл і в даний час розвивається невеликою командоюрозробників на Source. Forge. net.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:Трансляція програми в Microsoft Visual Studio 2005 1) Створити проект, обравши меню File->New->Project і"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="(!LANG:Трансляція програми в Microsoft Visual Studio 2005 2) У дереві проекту (View->Solution Explorer) додати"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Трансляція програми Microsoft Visual Studio 2005 3) Вибрати тип файлу Code C++, але вказати ім'я з розширенням. asm:

Трансляція програми Microsoft Visual Studio 2005 5) Встановити параметри компілятора. Вибрати правою кнопкою у файлі проекту меню Custom Build Rules…

Трансляція програми в Microsoft Visual Studio 2005 і у вікні вибрати Microsoft Macro Assembler.

Трансляція програми в Microsoft Visual Studio 2005 Перевірити правою кнопкою у файлі hello. asm дерева проекту меню Properties і встановити General->Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG:Трансляція програми в Microsoft Visual Studio 2005 6) Відкомпілювати файл, вибравши Build->Build hello. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Програмування в ОС Windows Програмування в OC Windows ґрунтується на використанні функцій API (Application Program Interface, тобто інтерфейс програмної програми). Їхня кількість досягає 2000. Програма для Windows значною мірою складається з таких викликів. Вся взаємодія з зовнішніми пристроямита ресурсами операційної системи відбувається, як правило, за допомогою таких функцій. Операційна система Windowsвикористовує пласку модель пам'яті. Адреса будь-якого осередку пам'яті визначатиметься вмістом одного 32-бітного регістру. Можливі 3 типи структур програм для Windows: діалогова (основне вікно - діалогове), консольна або безвіконна структура, класична структура (віконна, каркасна).

Виклик функцій Windows API У файлі допомоги будь-яка функція API представлена ​​у вигляді тип ім'я_функції (ФА 1, ФА 2, ФА 3) Тип – тип значення, що повертається; ФАх – перелік формальних аргументів у порядку їхнього прямування Наприклад, int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Ця функціявиводить на екран вікно з повідомленням та кнопкою (або кнопками) виходу. Сенс параметрів: h. Wnd - дескриптор вікна, у якому з'являтиметься вікно-повідомлення, lp. Text - текст, який з'являтиметься у вікні, lp. Caption - текст у заголовку вікна, u. Type – тип вікна, зокрема можна визначити кількість кнопок виходу.

Виклик функцій Windows API int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Майже всі параметри API-функцій насправді 32 -бітні цілі числа: HWND - 32 -бітне ціле, LPCTSTR - 32 -бітний покажчик на рядок, UINT - 32 -бітне ціле. До імені функцій часто додається суфікс "А" для переходу до нових версій функцій.

Виклик функцій Windows API int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); При використанні MASM необхідно наприкінці імені додати @N N – кількість байт, яке займають у стеку передані аргументи. Для функцій Win 32 API це можна визначити як кількість аргументів n, помножене на 4 (байта у кожному аргументі): N=4*n. Для виклику функції використається команда CALL асемблера. При цьому всі аргументи функції передаються до неї через стек (команда PUSH). Напрямок передачі аргументів: ЗЛІВА НАПРАВО - ЗНИЗУ ВГОРУ. Першим буде поміщатися в стек аргумент u. Тип. Виклик цієї функції буде виглядати так: CALL Message. Box. [email protected]

Виклик функцій Windows API int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Результат виконання будь-якої функції API - це, як правило, ціле число, яке повертається в регістрі EAX. Директива OFFSET є «зміщення в сегменті», або, переводячи в поняття мов високого рівня, «покажчик» початку рядка. Директива EQU подібно до #define у ​​мові СІ визначає константу. Директива EXTERN вказує на транслятор, що функція або ідентифікатор є зовнішнім по відношенню до даного модуля.

Приклад програми "Привіт усім!" . 686 P. MODEL FLAT, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Моя перша програма", 0 STR 2 DB "Привіт усім!", 0 HW DD? EXTERN Message. Box. [email protected]: NEAR. CODE START: PUSH MB_OK PUSH OFFSET 1 PUSH OFFSET 2 PUSH HW CALL Message. Box. [email protected] RET END START

Директива INVOKE Транслятор мови MASM дозволяє спростити виклик функцій з використанням макрозасобу – директиви INVOKE: INVOKE функція, параметр1, параметр2, … При цьому немає необхідності додавати @16 до виклику функції; параметри записуються точно в тому порядку, в якому наведено опис функції. макрозасобами транслятора параметри поміщаються у стек. Для використання директиви INVOKE необхідно мати опис прототипу функції з використанням директиви PROTO у вигляді: Message. Box. A PROTO: DWORD, : DWORD Якщо у програмі використовується безліч функцій Win 32 API, доцільно скористатися директивою include C: masm 32includeuser 32. inc

Курсова робота

З дисципліни «Системне програмування»

Тема №4: «Рішення задач на процедури»

Варіант 2

СХІДНО-СИБІРСЬКИЙ ДЕРЖАВНИЙ УНІВЕРСИТЕТ

ТЕХНОЛОГІЙ І УПРАВЛІННЯ

____________________________________________________________________

ТЕХНОЛОГІЧНИЙ КОЛЕДЖ

ЗАВДАННЯ

на курсову роботу

Дисципліна:
Тема: Вирішення задач на процедури
Виконавець(и):Главінська Аріна Олександрівна
Керівник: Дамбаєва Сесегма Вікторівна
Короткий зміст роботи: вивчення підпрограм мовою Асемблера,
розв'язання задач з використанням підпрограм
1. Теоретична частина: Основні відомості про мову Асемблер (набір
команд і т.д.), Організація підпрограм, Способи передачі параметрів
у підпрограмах
2. Практична частина: Розробити дві підпрограми, одна з яких перетворює будь-яку задану літеру в заголовну (у тому числі для російських літер), а інша перетворює літеру в рядкову.
перетворює будь-яку задану букву на головну, а інша перетворює букву на рядкову.
перетворює букву на рядкову.
Терміни виконання проекту за графіком:
1. Теоретична частина – 30 % до 7 тижня.
2. Практична частина – 70 % до 11 тижня.
3. Захист – 100% до 14 тижня.
Вимоги до оформлення:
1. Розрахунково-пояснювальна записка курсового проекту має бути представлена ​​в
електронної та твердої копії.
2. Обсяг звіту повинен бути не менше 20 машинописних сторінок без урахування додатків.
3. РПЗ оформляється за ГОСТом 7.32-91 та підписується у керівника.

Керівник роботи __________________

Виконавець __________________

Дата видачі " 26 " вересня 2017 р.


Вступ. 2

1.1 Основні відомості про мову Асемблер. 3

1.1.1 Набір команд. 4

1.2 Організація підпрограм у мові Ассемблер. 4

1.3 Способи передачі параметрів підпрограмах. 6

1.3.1 Передача параметрів через регістри.

1.3.2 Передача параметрів через стек. 7

2 ПРАКТИЧНИЙ РОЗДІЛ 9

2.1 Постановка задачі. 9

2.2 Опис розв'язання задачі. 9

2.3 Тестування програми.

Висновок. 8

Список літератури.


Вступ

Загальновідомо, що програмувати на Ассемблері важко. Як Ви знаєте, зараз існує багато різних мов високого рівня, які дозволяють витрачати набагато менше зусиль під час написання програм. Звичайно, виникає питання, коли у програміста може виникнути необхідність використовувати Ассемблер при написанні програм. В даний час можна вказати дві області, в яких використання мови асемблера виправдане, а часто і необхідне.

По-перше, це так звані машинно-залежні системні програми, зазвичай вони керують різними пристроямикомп'ютера (такі програми називають драйверами). У цих системних програмах використовуються спеціальні машинні команди, які не потрібно застосовувати у звичайних (або, як кажуть прикладних) програмах. Ці команди неможливо або дуже важко поставити в мові високого рівня.

Друга сфера застосування Асемблера пов'язана з оптимізацією виконання програм. Дуже часто програми-перекладачі (компілятори) з мов високого рівня дають дуже неефективну програму машинною мовою. Зазвичай це стосується програм обчислювального характеру, у яких більшу частину часу виконується дуже невелика (близько 3-5%) ділянка програми (головний цикл). Для вирішення цієї проблеми можуть використовуватися так звані багатомовні системи програмування, які дозволяють записувати частини програми різними мовами. Зазвичай основну частину програми записується мовою програмування високого рівня (Фортране, Паскале, З повагою та ін.), а критичні за часом виконання ділянки програми – на Асемблері. Швидкість роботи всієї програми може значно збільшитися. Часто це єдиний спосіб змусити програму дати результат за прийнятний час.

Метою даної курсової є отримання практичних навичок роботи програмування мовою асемблера.

Завдання роботи:

1. Вивчити основні відомості про мову Ассемблер (структура та компоненти програми на Ассемблері, формат команд, організація підпрограм та ін.);

2. Вивчити види бітових операцій, формат та логіку роботи логічних команд Асемблера;

3. Вирішити індивідуальне завдання застосування підпрограм в Асемблері;

4.. Сформулювати висновок про виконану роботу.

1 ТЕОРЕТИЧНИЙ РОЗДІЛ

Основні відомості про мову Ассемблер

Assembler - мова програмування низького рівня, що є формат запису машинних команд, зручний сприйняття людиною.

Команди мови асемблера один на один відповідають командам процесора і, фактично, є зручною символьною формою запису (мнемокод) команд та їх аргументів. Також мова асемблера забезпечує базові програмні абстракції: зв'язування частин програми та даних через мітки із символьними іменами та директиви.

Директиви асемблера дозволяють включати в програму блоки даних (описані явно або зчитані з файлу); повторити певний фрагмент вказану кількість разів; компілювати фрагмент за умовою; задавати адресу виконання фрагмента, змінювати значення міток у процесі компіляції; використовувати макровизначення з параметрами та ін.

Гідності й недоліки

· Мінімальна кількість надлишкового коду (використання меншої кількості команд та звернень на згадку). Як наслідок - більша швидкість і менший розмір програми;

· Великі обсяги коду, велика кількість додаткових дрібних завдань;

· погана читабельність коду, труднощі підтримки (налагодження, додавання можливостей);

· Проблема реалізації парадигм програмування та будь-яких інших скільки-небудь складних конвенцій, складність спільної розробки;

· менша кількість доступних бібліотек, їх мала сумісність;

· Безпосередній доступ до апаратури: портів введення-виводу, спеціальним регістрам процесора;

· максимальне «підгонка» для потрібної платформи (використання спеціальних інструкцій, технічні особливості «заліза»);

· Непереносимість інші платформи (крім двійково сумісних).

Крім інструкцій, програма може містити директиви: команди, що не переводяться безпосередньо в машинні інструкції, а керують роботою компілятора. Набір і синтаксис їх значно відрізняються і залежать не від апаратної платформи, а від компілятора, що використовується (породжуючи діалекти мов в межах одного сімейства архітектур). Як набор директив можна виділити:

· Визначення даних (констант та змінних);

· Керування організацією програми в пам'яті та параметрами вихідного файлу;

· Завдання режиму роботи компілятора;

· Різні абстракції (тобто елементи мов високого рівня) - від оформлення процедур та функцій (для спрощення реалізації парадигми процедурного програмування) до умовних конструкцій та циклів (для парадигми структурного програмування);

· Макроси.

Набір команд

Типовими командами мови асемблера є:

· Команди пересилання даних (mov та ін)

· Арифметичні команди (add, sub, imul та ін.)

· Логічні та побітові операції (or, and, xor, shr та ін)

· Команди управління ходом виконання програми (jmp, loop, ret та ін.)

· Команди виклику переривань (іноді відносять до команд управління): int

· Команди введення-виведення в порти (in, out)

Для мікроконтролерів та мікрокомп'ютерів характерні також команди, що виконують перевірку та перехід за умовою, наприклад:

· jne - перейти, якщо не одно;

· jge - перейти, якщо більше або дорівнює.

Тема 1.4 Асемблерна мнемоніка. Структура та формати команд. Види адресації. Система команд мікропроцесора

План:

1 Мова асемблера. Основні поняття

2 Символи мови асемблера

3 Типи операторів асемблера

4 Директиви асемблера

5 Система команд процесора

1 Язик асемблера. Основні поняття

Мова асемблера- це символічне уявлення машинної мови. Всі процеси в машині на найнижчому апаратному рівні приводяться в дію тільки командами (інструкціями) машинної мови. Звідси зрозуміло, що, незважаючи на загальну назву, мова асемблера для кожного типу комп'ютера своя.

Програма на асемблері є сукупністю блоків пам'яті, званих сегменти пам'яті.Програма може складатися з одного або кількох блоків-сегментів. Кожен сегмент містить сукупність речень мови, кожна з яких займає окремий рядок коду програми.

Пропозиції асемблера бувають чотирьох типів:

1) команди або інструкції, являють собою символічні аналоги машинних команд. У процесі трансляції інструкції асемблера перетворюються на відповідні команди системи команд мікропроцесора;

2) макрокоманди -оформлювані певним чином пропозиції тексту програми, які замінюються під час трансляції іншими пропозиціями;

3) директиви,є вказівкою транслятора асемблера виконання деяких дій. У директив немає аналогів у машинному поданні;

4) рядки коментарів , що містять будь-які символи, у тому числі літери російського алфавіту. Коментарі ігноруються транслятором.

­ Структура програми на асемблері. Синтаксис асемблера.

Пропозиції, що становлять програму, можуть бути синтаксичною конструкцією, що відповідає команді, макрокоманді, директиві або коментарю. Щоб транслятор асемблера міг розпізнати їх, вони мають формуватися за певними синтаксичними правилами. Для цього краще використовувати формальний опис синтаксису мови на кшталт правил граматики. Найбільш поширені способи подібного опису мови програмування - синтаксичні діаграмиі розширені форми Бекуса-Наура.Для практичного використання зручніші синтаксичні діаграми.Наприклад, синтаксис речень асемблера можна описати за допомогою синтаксичних діаграм, показаних на наступних малюнках 10, 11, 12.

Малюнок 10 - Формат пропозиції асемблера


­ Малюнок 11 - Формат директив

­ Малюнок 12 - Формат команд та макрокоманд

На цих малюнках:

­ ім'я мітки- ідентифікатор, значенням якого є адреса першого байта пропозиції вихідного тексту програми, яке він позначає;

­ ім'я -ідентифікатор, який відрізняє цю директиву від інших однойменних директив. В результаті обробки асемблером певної директиви цього імені можуть бути присвоєні певні характеристики;

­ код операції (КОП) та директива - це мнемонічні позначення відповідної машинної команди, макрокоманд або директиви транслятора;

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

Синтаксичні діаграми допомагають знайти і потім пройти шлях від входу діаграми (ліворуч) до її виходу (праворуч). Якщо такий шлях існує, то пропозиція чи конструкція синтаксично правильні. Якщо такого шляху немає, то цю конструкцію компілятор не прийме.

­ 2 Символи мови асемблера

Допустимими символами при написанні тексту програм є:

1) всі латинські літери: A-Z,a-z. При цьому великі та малі літери вважаються еквівалентними;

2) цифри від 0 до 9 ;

3) знаки ? , @ , $ , _ , & ;

4) роздільники , . () < > { } + / * % ! " " ? = # ^ .

Пропозиції асемблера формуються з лексем, що являють собою синтаксично нероздільні послідовності допустимих символів мови, що мають сенс транслятора.

Лексемамиє:

1) ідентифікатори - послідовності допустимих символів, що використовуються для позначення таких об'єктів програми, як коди операцій, імена змінних та назви міток. Правило запису ідентифікаторів полягає в наступному: ідентифікатор може складатися з одного або кількох символів;

2) ланцюжки символів - послідовності символів, укладені в одинарні або подвійні лапки;

3) цілі числа в одній з наступних систем числення : двійковою, десятковою, шістнадцятковою. Ототожнення чисел при запису в програмах на асемблері проводиться за певними правилами:

4) десяткові числа не вимагають для свого ототожнення вказівки будь-яких додаткових символів, наприклад 25 або 139. Для ототожнення в вихідному текстіпрограми двійкових чиселнеобхідно після запису нулів та одиниць, що входять до їх складу, поставити латинське “ b”, наприклад 10010101 b.

5) шістнадцяткові числа мають більше умовностей при своєму записі:

По-перше, вони складаються з цифр 0...9 , малих та великих літерлатинського алфавіту a,b, c,d,e,fабо A,B,C,D,E,F.

По-друге, у транслятора можуть виникнути труднощі з розпізнаванням шістнадцяткових чисел через те, що вони можуть складатися як з одних цифр 0...9 (наприклад, 190845), так і починатися з літери латинського алфавіту (наприклад, ef15). Для того, щоб "пояснити" транслятору, що дана лексема не є десятковим числом або ідентифікатором, програміст повинен спеціальним чином виділяти шістнадцяткове число. Для цього на кінці послідовності шістнадцяткових цифр, що становлять шістнадцяткове число, записують латинську букву “ h”. Це обов'язкова умова. Якщо шістнадцяткове число починається з літери, то перед ним записується провідний нуль: 0 ef15 h.

Практично кожна пропозиція містить опис об'єкта, над яким або за допомогою якого виконується певна дія. Ці об'єкти називаються операндами. Їх можна визначити так: операнди- це об'єкти (деякі значення, регістри або осередки пам'яті), на які діють інструкції чи директиви, або це об'єкти, які визначають чи уточнюють дію інструкцій чи директив.

Можливо, провести наступну класифікацію операндів:

­ постійні чи безпосередні операнди;

­ адресні операнди;

­ операнди, що переміщуються;

лічильник адреси;

­ регістровий операнд;

­ базовий та індексний операнди;

­ структурні операнди;

запису.

Операнди є елементарними компонентами, у тому числі формується частина машинної команди, що позначає об'єкти, з яких виконується операція. У загальному випадку операнди можуть входити як складові у складніші освіти, звані виразами.

Вирази є комбінації операндів і операторів, що розглядаються як єдине ціле. Результатом обчислення виразу може бути адреса деякої комірки пам'яті або деяке константне (абсолютне) значення.

­ 3 Типи операторів асемблера

Перелічимо можливі типи операторів асемблерата синтаксичні правила формування виразів асемблера:

­ арифметичні оператори;

­ оператори зсуву;

­ оператори порівняння;

­ логічні оператори;

­ індексний оператор;

­ оператор перевизначення типу;

­ оператор перевизначення сегмента;

­ оператор іменування типу структури;

­ оператор отримання сегментної складової адреси виразу;

­ оператор отримання усунення виразу.

1 Директиви асемблера

­ Директиви асемблера бувають:

1) Директиви сегментації. Під час попереднього обговорення ми з'ясували всі основні правила запису команд та операндів у програмі на асемблері. Відкритим залишилося питання, як правильно оформити послідовність команд, щоб транслятор міг їх обробити, а мікропроцесор - виконати.

При розгляді архітектури мікропроцесора ми дізналися, що він має шість сегментних регістрів, за допомогою яких може працювати одночасно:

­ з одним сегментом коду;

­ з одним сегментом стеку;

­ з одним сегментом даних;

­ із трьома додатковими сегментами даних.

Фізично сегмент є область пам'яті, зайняту командами та (або) даними, адреси яких обчислюються щодо значення у відповідному сегментному регістрі. Синтаксичний опис сегмента на асемблері є конструкцією, зображеною на малюнку 13:


­ Рисунок 13 - Синтаксичне опис сегмента на асемблері

Важливо відзначити, що функціональне призначення сегмента дещо ширше, ніж просте розбиття програми на блоки коду, даних та стека. Сегментація є частиною більш загального механізму, пов'язаного з модульного програмування концепції.Вона передбачає уніфікацію оформлення об'єктних модулів, створюваних компілятором, зокрема з різних мов програмування. Це дозволяє об'єднувати програми, написані різними мовами. Саме для реалізації різних варіантів такого об'єднання призначені операнди в директиві SEGMENT.

2) Директиви управління лістингом. Директиви управління лістингом поділяються на такі групи:

­ загальні директиви управління лістингом;

­ директиви виведення в лістинг файлів, що включаються;

­ директиви виведення блоків умовного асемблювання;

­ директиви виведення у лістинг макрокоманд;

­ директиви виведення в лістинг інформації про перехресні посилання;

­ директиви зміни формату лістингу

2 Система команд процесора

Система команд процесора представлена ​​малюнку 14.

Розглянемо основні групи команд.

­ Рисунок 14 - Класифікація команд асемблера

Команди бувають:

1 Команди пересилання даних. Ці команди займають дуже важливе місце у системі команд будь-якого процесора. Вони виконують такі найважливіші функції:

­ збереження у пам'яті вмісту внутрішніх регістрів процесора;

­ копіювання вмісту з однієї області пам'яті до іншої;

­ запис у пристрої вводу/виводу та читання з пристроїв введення/виводу.

У деяких процесорах ці функції виконуються однією єдиною командою MOV (для байтових пересилань - MOVB ) але з різними методамиадресації операндів.

В інших процесорах крім команди MOV є ще кілька команд до виконання перелічених функций. Також до команд пересилання даних належать команди обміну інформацією (їх позначення будується на основі слова Exchange ). Може бути передбачений обмін інформацією між внутрішніми регістрами, між двома половинами одного регістру ( SWAP ) або між регістром та осередком пам'яті.

2 Арифметичні команди. Арифметичні команди розглядають коди операнда як числові двійкові або двійково-десяткові коди. Ці команди можуть бути поділені на п'ять основних груп:

­ команди операцій з фіксованою комою (додавання, віднімання, множення, розподіл);

­ команди операцій з плаваючою комою (додавання, віднімання, множення, розподіл);

­ команди очищення;

­ команди інкременту та декременту;

­ команда порівняння.

3 Команди операцій із фіксованою комою працюють із кодами в регістрах процесора чи пам'яті як із звичайними двійковими кодами. Команди операцій з плаваючою комою (точкою) використовують формат уявлення чисел з порядком і мантисою (зазвичай ці числа займають два послідовні осередки пам'яті). У сучасних потужних процесорах набір команд з плаваючою комою не обмежується лише чотирма арифметичними діями, а містить і безліч інших складніших команд, наприклад, обчислення тригонометричних функцій, логарифмічних функцій, а також складних функцій, необхідних при обробці звуку та зображення.

4 Команди очищення призначені для запису нульового коду в регістр або осередок пам'яті. Ці команди можуть бути замінені командами пересилання нульового коду, але спеціальні команди очищення зазвичай виконуються швидше, ніж команди пересилання.

5 Команди інкременту (збільшення на одиницю) та декременту

(Зменшення на одиницю) також бувають дуже зручні. Їх можна в принципі замінити командами підсумовування з одиницею або віднімання одиниці, але інкремент і декремент виконуються швидше, ніж підсумовування та віднімання. Ці команди вимагають одного вхідного операнда, який є і вихідним операндом.

6 Команда порівняння призначена для порівняння двох вхідних операндів. По суті, вона обчислює різницю цих двох операндів, але вихідного операнда не формує, а лише змінює біти в регістрі стану процесора за результатом цього віднімання. Наступна за командою порівняння команда (зазвичай це команда переходу) аналізуватиме біти в регістрі стану процесора і виконуватиме дії в залежності від їх значень. У деяких процесорах передбачені команди ланцюжкового порівняння двох послідовностей операндів, що у пам'яті.

7 Логічні команди. Логічні команди виконують над операндами логічні (побітові) операції, тобто розглядають коди операндів не як однину, бо як набір окремих бітів. Цим вони відрізняються від арифметичних команд. Логічні команди виконують такі основні операції:

­ логічне І, логічне АБО, додавання за модулем 2 (Виключає АБО);

­ логічні, арифметичні та циклічні зрушення;

­ перевірка бітів та операндів;

­ установка та очищення бітів (прапорів) регістру стану процесора ( PSW).

Команди логічних операцій дозволяють бітно обчислювати основні логічні функції від двох вхідних операндів. Крім того, операція І використовується для примусового очищення заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають очищення, встановлені в нуль). Операція АБО застосовується для примусової установки заданих бітів (як один з операндів при цьому використовується код маски, в якому розряди, що вимагають установки в одиницю, дорівнюють одиниці). Операція «Виключає АБО» використовується для інверсії заданих бітів (як один з операндів при цьому застосовується код маски, в якому біти, що підлягають інверсії, встановлені в одиницю). Команди вимагають двох вхідних операндів та формують один вихідний операнд.

8 Команди зрушень дозволяють бітно зрушувати код операнда вправо (у бік молодших розрядів) або вліво (у бік старших розрядів). Тип зсуву (логічний, арифметичний або циклічний) визначає, яке буде нове значення старшого біта (при зрушенні вправо) або молодшого біта (при зрушенні вліво), а також визначає, чи буде десь збережено колишнє значення старшого біта (при зрушенні вліво) або молодшого біта (при зрушенні праворуч). Циклічні зрушення дозволяють зрушувати біти коду операнда по колу (за годинниковою стрілкою при зрушенні праворуч або проти годинникової стрілки при зрушенні вліво). При цьому кільце зсуву може входити або не входити прапор переносу. У біт прапора перенесення (якщо він використовується) записується значення старшого біта при циклічному зсуві вліво та молодшого біта при циклічному зрушенні вправо. Відповідно, значення біта прапора переносу переписуватиметься в молодший розряд при циклічному зрушенні вліво і старший розряд при циклічному зрушенні вправо.

9 Команди переходів. Команди переходів призначені в організацію різноманітних циклів, розгалужень, викликів підпрограм тощо., тобто вони порушують послідовний хід виконання програми. Ці команди записують в регістр-лічильник команд нове значення і тим самим викликають перехід процесора не до наступної порядку команди, а до будь-якої іншої команди в пам'яті програм. Деякі команди переходів передбачають повернення назад, у точку, з якої було зроблено перехід, інші не передбачають цього. Якщо повернення передбачено, поточні параметри процесора зберігаються в стеку. Якщо повернення не передбачено, поточні параметри процесора не зберігаються.

Команди переходів без повернення поділяються на дві групи:

­ команди безумовних переходів;

­ команди умовних переходів

В позначках цих команд використовуються слова Branch (розгалуження) та Jump (стрибок).

Команди безумовних переходів викликають перехід на новий адресу незалежно від чого. Вони можуть викликати перехід на вказану величину зсуву (вперед або назад) або на вказану адресу пам'яті. Величина зміщення або нове значення адреси вказуються як вхідний операндо.

Команди умовних переходів викликають перехід який завжди, лише за виконання заданих умов. Як такі умови зазвичай виступають значення прапорів у регістрі стану процесора ( PSW ). Тобто умовою переходу є результат попередньої операції, яка змінює значення прапорів. Усього таких умов переходу може бути від 4 до 16. Декілька прикладів команд умовних переходів:

­ перехід, якщо дорівнює нулю;

­ перехід, якщо не дорівнює нулю;

­ перехід, якщо є переповнення;

­ перехід, якщо немає переповнення;

­ перехід, якщо більше за нуль;

­ перехід, якщо менше або дорівнює нулю.

Якщо умова переходу виконується, проводиться завантаження в регістр-лічильник команд нового значення. Якщо ж умова переходу не виконується, лічильник команд просто нарощується, і процесор вибирає та виконує наступну по порядку команду.

Спеціально для перевірки умов переходу застосовується команда порівняння (БМР), що передує команді умовного переходу (або навіть кільком командам умовних переходів). Але прапори можуть встановлюватися і будь-якою іншою командою, наприклад, командою пересилання даних, будь-якою арифметичною або логічною командою. Зазначимо, що самі команди переходів прапори не змінюють, що й дозволяє ставити кілька команд переходів одну за одною.

Особливе місце серед команд переходу із поверненням займають команди переривань. Ці команди в якості вхідного операнда вимагають номер переривання (адреса вектора).

Висновок:

Мова асемблера – це символічне уявлення машинної мови. Мова асемблера для кожного типу комп'ютера своя. Програма на асемблері є сукупність блоків пам'яті, званих сегментами пам'яті. Кожен сегмент містить сукупність речень мови, кожна з яких займає окремий рядок коду програми. Пропозиції асемблера бувають чотирьох типів: команди чи інструкції, макрокоманди, директиви, рядки коментарів.

Допустимими символами при написанні тексту програм є всі латинські літери: A-Z,a-z. При цьому великі та малі літери вважаються еквівалентними; цифри від 0 до 9 ; знаки ? , @ , $ , _ , & ; роздільники , . () < > { } + / * % ! " " ? = # ^ .

Застосовують такі типи операторів асемблера та синтаксичні правила формування виразів асемблера. арифметичні оператори, оператори зсуву, оператори порівняння, логічні оператори, індексний оператор, оператор перевизначення типу, оператор перевизначення сегмента, оператор іменування типу структури, оператор отримання сегментної складової адреси виразу, оператор отримання зміщення виразу.

Система команд поділена на 8 основних груп.

­ Контрольні питання:

1 Що є мовою асемблера?

2 Які символи можна використовувати для запису команд на асемблері?

3 Що являють собою мітки та їх призначення?

4 Поясніть структуру команд асемблера.

5 Перерахувати 4 типи пропозицій асемблера.