к лек_5. Введення в асемблер поняття низькорівневого програмування
Скачать 0.93 Mb.
|
ВВЕДЕННЯ В АСЕМБЛЕРПОНЯТТЯ НИЗЬКОРІВНЕВОГО ПРОГРАМУВАННЯНизькорівневе програмування– це програмування, засноване на прямому використанні можливостей і особливостей конкретної обчислювальної системи Різновиди низькорівневих мов: машинний код; мнемокод; асемблер. ПОНЯТТЯ НИЗЬКОРІВНЕВОГО ПРОГРАМУВАННЯМашинний код Мнемоніка Асемблер відрізняється від свого попередника - мнемокода великим набором директив транслятора, які істотно спрощують процес кодування програми, в першу чергу директивами оформлення програми у вигляді логічно закінчених елементів і макросредств на Асемблері пишуть: 1) все, що вимагає максимальної швидкості виконання: основні компоненти комп'ютерних ігор, ядра операційних систем реального часу і просто критичні ділянки програм; 2) все, що взаємодіє із зовнішніми пристроями: драйвери; програми, що працюють безпосередньо з портами, звуковими і відеоплатами; 3) все, що повністю використовує можливості процесора: ядра багатозадачних операційних систем, DPMI-сервери і взагалі будь-які програми, які переводять процесор в захищений режим; 4) все, що повністю використовує можливості операційної системи: віруси і антивіруси; програми захисту від несанкціонованого доступу; програми, які оминають цей захист, і програми, що захищають від даних програм; і багато іншого. АСЕМБЛЕРИПід словом Асемблер (від англ. Assembly - «асемблювання», «компонування», «складання»; Assembler - «збирач», «транслятор») розуміють два різних поняття: 1. мова Ассемблера (Assembly Language– «мова асемблювання»; Assembler Language– «мова асемблера») – це одна з мов програмування низького рівня (машинно-орієнтована мова програмування), в якій для представлення команд використовуються скорочення і абревіатури. Кожен тип процесорів має власний набір машинних команд, тому під нього створюється своя унікальна мова Асемблера. 2. програмну (оболонку) Асемблера (Assembly Program – «програма асемблювання», Assembler Program – «програма асемблера») – це транслятор з мови асемблера, компонуча програма, програма збірки. Програма Асемблера переводить (транслює) команди вихідного тексту програми на мові Асемблера в об'єктний код або безпосередньо в виконуваний машинний код, тобто переводить текст з мови, зрозумілої людині, в мову, зрозумілу процесору. Коли говорять «програма на Асемблері», мають на увазі мову, а коли говорять «Макроасемблер версії 6.13», мають на увазі програму. ОСНОВНІ ПОНЯТТЯКомпілятор (транслятор) (Compiler, Translator) - це програма, яка переводить текст програми в об'єктний або безпосередньо виконуваний код. Процес компіляції (трансляції) складається з двох стадій: 1) аналізу (лексичного, синтаксичного, семантичного); 2) синтезу. На стадії аналізу програма розбивається на складові частини і перевіряється її коректність (правильність використання команд, змінних і т. д.). На стадії синтезу з внутрішнього уявлення спочатку генерується програма на проміжній мові, яка потім оптимізується, після чого кодогенератор породжує програму на машинній мові (об'єктний або виконуваний код). У Асемблері обов'язково повинна бути ще одна програма - компонувальник (Linker), яка і створює виконані файли з одного або декількох об'єктних модулів, отриманих після компіляції (трансляції). Отладчик (Debugger) - крім пошуку помилок отладчики іноді застосовують і для того, щоб досліджувати роботу існуючих програм. Популярні отладчики, що поширються разом з відповідними асемблерами, - Codeview (Microsoft), Turbo Debugger (Borland) і Watcom Debugger (Watcom). ОСНОВНІ ПОНЯТТЯЩе одна особливість асемблера, яка відрізняє його від всіх інших мов програмування, - можливість дизасембювання. Тобто, маючи виконуваний файл, за допомогою спеціальної програми дизасемблера (Disassembler) майже завжди можна отримати вихідний текст на Асемблері. Наприклад, можна дизасемблювати код BIOS вашого комп'ютера і дізнатися, як виконується перемикання відеорежимів, або драйвер для DOS, щоб написати такий же для Windows. Кращі дизасемблери на сьогоднішній день - Sourcer від V Communications і IDA. Шістнадцятковий редактор (Hexadecimal Editor). Чимало таких редакторів (Hiew, Proview, Iview, Hexit) теж мають вбудований дизассемблер, так що можна, наприклад, відкривши в такому редакторі свою програму, подивитися, як скомпілювати ту чи іншу ділянку програми, поправити якусь команду асемблера або змінити значення констант і тут же, без перекомпіляції, запустити програму, щоб подивитися на результат змін. Програма на мові асемблера являє собою послідовність операторів, що описують виконувані операції. Оператором (рядком) вихідної програми може бути або команда, або псевдооператор (директива) Асемблера. Команди виконуються в процесі виконання задачі на комп'ютері, а директиви - в процесі асемблювання (трансляції) програми. На відміну від команд псевдооператор або директиви повідомляють Асемблеру (транслятору), що йому робити з командами і даними, які вводяться в програмі. СИНТАКСИС АСЕМБЛЕРАЄдина обов'язкова частина команди мови асемблера - ОпКод (скорочення від ОПераційний КОД). Поле операндів містить додаткову інформацію про команду, наприклад, які значення беруть участь в операції. Поле операндів визначається операційним кодом. Кожному коду операції повинно відповідати певне число операндів. Поле мітки дозволяє позначити яке-небудь конкретне місце в пам'яті комп'ютера. Власна адреса є у будь-якої ділянки пам'яті, але виділити адресу будь-якої команди важко, якщо взагалі можливо. Мітка дозволяє ідентифікувати певне місце в пам'яті заданим програмістом ім'ям, тобто, поле мітки містить символічний покажчик розташування команди. Якщо ми хочемо звернутися до цієї команди пізніше, то ми робимо це через символьне ім'я і нам не потрібно вказувати абсолютне розташування даної інструкції. СИНТАКСИС АСЕМБЛЕРААсемблер НЕ РОЗРІЗНЯЄ великі та малі літери. В якості операнда в команді може фігурувати константа, яка може бути введена в наступних формах: - двійковій, як послідовність цифр 0 і 1, що закінчуються буквою В, наприклад, 10111010В; - десятковій (у звичній десятковій системі числення з необов'язковою буквою D на кінці), наприклад, 129D або просто 129; - шістнадцятковій, як послідовність цифр від 0 до 9 і букв від А до F, що закінчується буквою Н. Першим символом може бути тільки цифра від 0 до 9, наприклад, 0Е23Н (в даному випадку перша цифра інформує асемблер про те, що Е23 число, а не ідентифікатор або змінна); - літералом, рядок букв, цифр і інших символів, укладених в лапки або апострофи. СИНТАКСИС АСЕМБЛЕРАМнемокод можуть мати від 2 до 6 букв, при трансляції мнемокод перетворюється в числове значення по таблиці перекодування (всередині транслятора). Мнемокоди мають жорсткий формат, який передбачає 1, 2 або відсутність операндів. Якщо операндів 2, вони відокремлюються один від одного комою. GETCOUNT: MOV CX, DX ; ініціалізація лічильника, помістити вміст регістра DX в регістр СХ PUSH F ; команда зберігає в стеку вміст регістра прапорів DAA ; команда десяткової корекції СИНТАКСИС АСЕМБЛЕРАОперанди команди можуть задаватися по-різному: 1) неявно на мікропроцесорному рівні. Такі команди працюють або з регістрами, або з прапорами і в конкретній команді об'єкт визначається кодом команди, наприклад: PUSH F ; команда пересилання прапорів в стек. Джерело (звідки беруться дані) і приймач (куди пересилаються) визначаються кодом команди; або CLD ; обнуління прапора напрямку DF; 2) явно в самій команді (безпосередній операнд), наприклад: MOV АХ,0; 3) одним з регістрів загального призначення (РЗП) або сегментним регістром; СИНТАКСИС АСЕМБЛЕРА4) ідентифікатором змінної (міткою змінної, описаною в сегменті даних). В цьому випадку операнд розташовується в ОЗП. При непрямій адресації адреса-зміщення змінної в ОЗП поміщається в РЗП або в індексний регістр і в команді використовується посилання на цей регістр; 5) номером порту введення-виведення. У цьому випадку номер задається шістнадцятковою константою; 6) регістром стека, коли використовуються команди роботи зі стеком і в цьому випадку операнд або заноситься в вершину стека, або зчитується з вершини стека. СИНТАКСИС АСЕМБЛЕРАМіткою є послідовність літер і цифр, після якої ставиться двокрапка. Не можна використовувати в якості міток імена регістрів і Мнемокод, крім того мітка повинна починатися з літери, але може містити цифри і спец. символи: ?, @, /, _, $ і точку, однак точка може бути тільки першим символом мітки. СИНТАКСИС АСЕМБЛЕРАВажливою особливістю машинних команд є те, що вони не можуть маніпулювати одночасно 2-мя операндами, що знаходяться в ОЗП. Це означає, що в команді тільки 1 операнд може вказувати на комірку ОЗП, 2-ий повинен бути або регістром, або безпосередньо вказувати значення. З цієї причини можливі такі поєднання операндів в команді: регістр - регістр; регістр – пам’ять; пам’ять - регістр; регістр - безпосередній операнд; пам’ять - безпосередній операнд. Для команд характерно, що якщо в них присутні 2 операнди, то 1-ий є Приймачем, а 2-ий -Джерелом, інакше кажучи результат операції зберігається за 1-им адресом, ось чому 1-ий операнд ніколи не може бути безпосереднім операндом або інакше кажучи, константою. ДИРЕКТИВИ АСЕМБЛЕРА І ЇХ КЛАСИФІКАЦІЯДИРЕКТИВИ РЕЖИМІВ ТРАНСЛЯЦІЇДирективи управління лістингом: .LIST – додати в лістинг всі рядки вихідного тексту програми; .NOLIST – вилучити з лістингу вихідний текст; .SUMS – додати в лістинг таблицю символів; .NOSUMS – виключити з лістингу таблицю символів і т. д. Директиви вказівки типу процесора : .8086 – дозволено використовувати апаратуру мікропроцесора 8086; .80286 – те ж саме, але мікропроцесора 80286; .80286Р – дозволяє використання привілейованих команд мікропроцесора 80286; .80386; .80386Р і т. д. Основа системи числення: . RADIX 2 - як двійкові; .RADIX 8 - як вісімкові; .RADIX 10 - як десяткові; .RADIX 16 - як шістнадцяткові .code – відкриває опис сегмента кодів команд; .data – починає опис сегмента даних; .stack – описує сегмент стека, в якості аргументу цієї директиви може вказуватися розмір стека в байтах Сегментом називається частина програми, яка містить сукупність логічно однорідної інформації |