Асемблер

Матеріал з Вікіпедії — вільної енциклопедії.
Версія від 12:41, 8 травня 2021, створена Vlad Shkeda (обговорення | внесок) (Були змінені неправильно написані слова)
Перейти до навігації Перейти до пошуку

Асе́мблер (англ. assembler) — комп'ютерна програма-транслятор, що призначена для генерації машинного (двійкового) коду з символьного представлення цього коду (мови асемблера). Наприклад, текстовий рядок CLI для архітектури x86 перетворюється асемблером у двійковий код 11111010. Крім власне трансляції, багато програм-асемблерів підтримують і іншу функціональність, корисну при розробці системного і прикладного програмного забезпечення, таку як вибір формату об'єктного модуля, генерація символьної інформації (наприклад, відлагоджувальної), різноманітні директиви на зразок EXTERN чи GLOBAL, макрокоманди тощо.

При трансляції з мов високого рівня асемблер нерідко використовується для виконання завершальної фази трансляції.

Історія

Один з перших асемблерів було створено Натаніелем Рочестером для машини IBM 701. Асемблер одразу полегшив працю першим програмістам: замість кодів машинних команд стало можливим писати програму у символьній (алфавітно-цифровій) формі, і найголовніше, відпала необхідність ручного перерахунку всіх адрес переходів при зміні програми. Асемблери 1950-х років, що мали назву автокодерів, були одними з перших, що надавали можливість означення і використання макрокоманд. Починаючи з 1960-1970-х років зростає важливість взаємодії і інтеграції програм і фрагментів мовою асемблера з модулями, написаними на мовах програмування високого рівня. До сьогодні такі програми, як асемблер і компонувальник є абсолютно необхідними інструментами при представленні нової архітектури комп'ютера чи процесора.

Базова трансляція

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

 mov eax, 0F00BADh
 jmp eax

асемблером для 32-розрядної архітектури x86 одразу може бути згенерований машинний код відповідної команди процесора і її аргументів (B8 AD 0B F0 00 FF E0). Якщо ж у програмі присутні команди безпосередньо переходу за мітками, алгоритм роботи асемблера ускладнюється: потрібні як мінімум два перегляди (або проходи) тексту програми. При першому перегляді здійснюється розподіл пам'яті і надання значень символічним іменам; при другому — формується об'єктний модуль. В процесі трансляції асемблер проводить повний синтаксичний аналіз початкової програми, забезпечуючи при цьому достатньо точну діагностику помилок за місцем і характером.

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

Докладніше: Макроасемблер

На додачу до базової трансляції, одним з найбільш вживаних механізмів програм-асемблерів є макроінструкції, починаючи з найпростішої заміни тексту, і до сучасних вбудованих макропроцесорів, з доволі складними можливостями підстановки і розкриття параметрів. Наприклад, асемблери NASM і YASM реалізують власний стек макропроцесора (директиви %push і %pop), можуть здійснювати зсув переданих макрокоманді параметрів на задану кількість (%rotate), повторювати емітування послідовності команд (%rep / %endrep), здійснювати умовну трансляцію (директиви %ifdef і подібні). Пакети макрокоманд для багатих на можливості асемблерів надають програмістам навіть механізм, наближені до структурного програмування, коли програма на мові асемблера виглядає так, немов би вона містить такі сутності, як процедури і функції, локальні змінні, структури даних з можливістю символічної адресації полів, інструкції-перемикачі і тому подібне.[1]

Асемблер NASM (а також майже повністю сумісний YASM) реалізує підтримку одразу кількох форматів об'єктних файлів. Така можливість надзвичайно корисна при крос-компіляції, коли, наприклад, на комп'ютері з операційною системою GNU/Linux потрібно отримати об'єктний файл у форматі PE для систем типу Microsoft Windows. Можливо також задати трансляцію безпосередньо у формат двійкового коду (bin), коли потрібна відповідність «один в один» між текстом програми і згенерованим кодом.

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

Асемблери для архітектури x86

  • Транслятори:
    • MASM - Microsoft Macro Assembler, ліцензія Microsoft EULA
    • GAS - GNU Assembler, ліцензія GNU GPL
    • FASM - flat assembler, ліцензія BSD
    • NASM - Netwide Assembler, ліцензія BSD
    • RosASM
    • TASM - Turbo Assembler від Borland, пропрієтарний, підтримку припинено
    • Yasm - вільний асемблер на основі NASM, ліцензія BSD
    • WASM - Open Watcom Assembler, ліцензія Sybase Open Watcom Public License
    • GoAsm - вільний асемблер від Джеремі Гордона

Асемблери для інших архітектур

  • HLASM - High Level Assembler від IBM

Література

Посилання