Кожна мова асемблера специфічна для конкретної комп'ютерної архітектури. На відміну від цього, програми на мовах програмування високого рівня, як правило, здатні виконуватися на декількох архітектурах, хоча вимагають специфічної для платформиінтерпретації або компіляції.
Програма мовою асемблера перетворюється у виконуваний машинний код за допомогою програми-асемблера. Процес перетворення називають асемблюванням або збіркою (англ.assembly, assembling). У більшості випадків цей процес відбувається у два етапи: асемблювання і компонування[3] (англ.linking).
Асемблер (англ.assembler — складальник) — комп'ютерна програма, що генерує об'єктний двійковий код з заданої (як правило у текстовому вигляді) послідовності машинних інструкцій. Кожна інструкція має свою мнемоніку, і складається з символічної назви (наприклад, MOV — від англ.move, «перемістити»), за якою опціонально можуть слідувати операнди.
Асемблер також обчислює значення констант і здійснює резолвінг символічних імен (і, якщо потрібно, записує у об'єктний файл адреси, які потрібно модифікувати під час компонування чи завантажування програми).[4] Використання символьних посилань і автоматизація обчислень адрес є однією з ключових особливостей асемблера, яка звільняє програміста від кропітких ручних обчислень (які доводилося б робити навіть при додаванні чи вилученні однієї інструкції програми). Більшість асемблерів також мають макрокоманди, що дозволяють замінювати у програмі повторювані фрагменти коду викликом макроса.
У простому випадку асемблер переводить одну операцію (машинну команду з параметрами) початкової програми у відповідний машинний код (так звана трансляція «один в один»). При цьому взаємне розташування кодів інструкцій у об'єктному модулі визначається порядком операцій у початковій програмі і повністю залежить від програміста. Для розширення можливостей низькорівневого програмування асемблери можуть реалізовувати підтримку макрокоманд — груп команд, що можуть вставлятися до програми потрібну кількість разів. В цьому випадку перед трансляцією проводиться заміна макрокоманд макророзширеннями — послідовностями команд на базовій мові відповідно до макроозначень. У останніх задається прототип макрокоманди зі структурою списку параметрів і процедура генерування макророзширення. Транслятор, що виконує функції макрогенератора і асемблера, називається макроасемблером. При трансляції з мов високого рівня асемблер нерідко використовується для виконання завершальної фази трансляції.
Трансляція зазвичай вимагає двох переглядів початкової програми: при першому перегляді здійснюється розподіл пам'яті і надання значень символічним іменам; при другому — формується робоча програма у вигляді об'єктного файлу. В процесі трансляції асемблер проводить повний синтаксичний контроль початкової програми, забезпечуючи при цьому достатньо точну діагностику помилок за місцем і характером.
Вважається[ким?], що мова асемблера є низькорівневою (на противагу мовам програмування високого рівня, що частково чи повністю абстрагуються від деталей реалізації команд процесора). Чим нижчий рівень мови програмування, тим ближча специфіка роботи програми до самого процесора, для якого вона й була написана. Вважається[ким?], що мови низького рівня складніші й потребують більш вузької спеціалізації програміста, оскільки програма написана на асемблері для одного типу процесорів виявиться не завжди придатною для роботи з іншими процесорами. З іншого боку, програми написані на асемблері компактні та швидкі, що теж важливо.
Опис мови асемблера
Цей розділ не містить посилань на джерела. Ви можете допомогти поліпшити цей розділ, додавши посилання на надійні (авторитетні) джерела. Матеріал без джерел може бути піддано сумніву та вилучено.
Команди мови асемблера відповідають машинним кодам відповідного мікропроцесора чи мікроконтролера. Фактично, мова асемблера являє собою зручнішу символьну форму запису машинних команд. Як наслідок, програми написані для одного типу процесорів, на іншому не будуть функціонувати. Мова асемблера також містить засоби для створення міток та переходів, що необхідно для створення циклів та розгалужень. Можуть бути наявні засоби для створення макросів, процедур. Кожне сімейство (модельний ряд) мікропроцесорів має свій набір команд і, відповідно, свій набір інструкцій на мові асемблера.
Переваги і недоліки
мінімальна кількість надлишкового коду (використання меншої кількості команд та звернень в пам'ять). Як наслідок — велика швидкість і менший розмір програми;
великі обсяги коду, велике число додаткових дрібних завдань;
погана читабельність коду, труднощі підтримки (налагодження, додавання можливостей);
труднощі реалізації парадигм програмування та будь-яких інших скільки-небудь складних конвенцій, складність спільної розробки;
меншу кількість доступних бібліотек, їх мала сумісність;
безпосередній доступ до апаратури: портам введення-виведення, особливим регістрам процесора;
максимальна «підгонка» для потрібної платформи (використання спеціальних інструкцій, технічних особливостей «заліза»);
неможливість роботи на платформах з іншою (несумісною) архітектурою.
Крім інструкцій, програма може містити директиви: команди, що не переводяться безпосередньо в машинні інструкції, а керують роботою компілятора. Набір і синтаксис їх значно різняться і залежать не від апаратної платформи, а від використовуваного компілятора (породжуючи діалекти мов в межах одного сімейства архітектур). Як набір директив можна виділити:
визначення даних (констант і змінних);
керування організацією програми в пам'яті і параметрами вихідного файлу;
завдання режиму роботи компілятора;
всілякі абстракції (тобто елементи мов високого рівня) — від оформлення процедур і функцій (для спрощення реалізації парадигми процедурного програмування) до умовних конструкцій і циклів (для парадигми структурного програмування);
макроси.
Використання мови
Історичні відомості
Мови асемблера, так само як і використання слова assembly, беруть свій початок від перших ЕОМ зі збереженням програми. Один з перших асемблерів було розроблено у 1947 році Катлін Бут (Kathleen Booth) для машини ARC2 в університеті Біркбек (Лондон), після консультацій з Джоном фон Нойманом і Германом Ґолдстіном у Інституті перспективних досліджень.[5][6] Машина EDSAC у 1949 році мала асемблер під назвою initial orders з однолітерними мнемоніками.[7] Для машин IBM 650 існувала програма SOAP (Symbolic Optimal Assembly Program), написана Стеном Полі (Stan Poley) у 1955-му.[8]
Мови асемблера дозволили вивільнити програмістів від надзвичайно низькорівневих, рутинних і втомливих «ручних» процедур, яких потребували перші комп'ютери —запам'ятовування людиною кодів команд, адрес, ручного обчислення адрес переходів (і зміни їх при кожному додаванні чи вилученні команд), представлення чисел тощо. Приблизно до середини 1980-х років асемблери широко використовувалися у програмуванні — як для великих ЕОМ (мейнфреймів), так і для персональних і мікрокомп'ютерів. Втім, прогрес у розвитку процесорів і пам'яті спричинив активний прогрес методів компіляції з високорівневих мов і появу компіляторів, що значно підвищували продуктивність роботи програміста. У 21-му столітті мови асемблера використовуються там, де потрібне пряме керування апаратурою, доступ до спеціалізованих інструкцій процесора чи співпроцесорів, або для кодування критичних (до часу чи розміру) секцій програми. Типовими сферами застосування асемблера є драйвери пристроїв, вбудовані системи, системи реального часу, ядра ОС, резидентні монітори тощо.
Багато важливих програм було написано цілком на мові асемблера (лише у 1961-му з'явилася перша операційна система Burroughs MCP, написана частково на мові високого рівня (алголоподібний ESPOL)). Велика кількість комерційного програмного забезпечення для мейнфреймів IBM також написана на асемблері.
Більшість ранніх мікрокомп'ютерів, обмежених у оперативній пам'яті, потребувало програмного забезпечення, написаного вручну майже виключно на асемблері, включно з кодом BIOS, дискової операційної системи і великої кількості прикладних програм. Типовими прикладами великих асемблерних програм 1970-80-х років є BIOS і DOS для комп'ютерів IBM PC, компілятор Turbo Pascal, перші програми електронних таблиць (наприклад, Lotus 1-2-3), численні комп'ютерні ігри.
Застосування у нинішній час
З часів винаходу перших компіляторів йшли дебати щодо доцільності використання мови асемблера у програмуванні прикладних задач. Втім, системне програмування завжди лишалося особливою нішею, де асемблер був і залишається важливим.
Мови асемблера досі вивчаються на більшості курсів інформатики і електроніки та мікропроцесорної техніки. Фундаментальні поняття, такі як двійкова арифметика, керування пам'яттю, стек, кодування символів, переривання, проєктування компіляторів тощо можуть бути повністю осягнені людиною лише при ґрунтовному розумінні роботи комп'ютера на апаратному рівні, що неодмінно передбачає розуміння набору команд і адресації процесора.
Програми, повністю незалежні від основних системних бібліотек (таких як libc чи crt0)
Різні типи оптимізації, що з тих чи інших причин недоступні при кодуванні на мові високого рівня
Приклади
Приклади програми Hello, World! для різних платформ і асемблерів.
EXE-програма на TASM для MS-DOS, платформа Intel x86
tasm hello.asm
tlink hello.obj
.modelsmall; модель пам'яті.data; сегмент данихmsgdb'Hello,World',13,10,'$'; текстове повідомлення.code; сегмент кодуstart:; точка входу в програму movax,@data; налаштування сегментногоmovds,ax; регістра данихmovah,09h; функція DOS № 9 – вивести рядокleadx,msg; адреса текстового повідомленняint21h; виклик переривання DOSmovaр,4Ch; Функція DOS № 4Ch – завершити програму moval,0; код повернення 0int21h; виклик переривання DOSendstart
org100h;зсув на 100h байт.modeltiny;модель пам'яті.data;сегмент данихprintdb"helloworld!$";рядок, який треба вивести.code;сегмент кодуmovah,9;функція MS-DOS номер 9 - вивести рядокmovdx,offsetprint;запис в регістр dx адреси першого байту рядку printint21h;виклик 21-го переривання MS-DOSret;Повернення контролю операційній системі
SECTION.data; сегмент данихmsgdb"Hello,world!",10; текстовий рядокlenequ$-msg; довжина рядкаSECTION.text; сегмент кодуglobal_start_start:; точка входу в програму moveax,4; системний виклик № 4 (sys_write)movebx,1; номер пристрою (stdout)movecx,msg; текстове повідомленняmovedx,len; довжина повідомленняint0x80; виклик ядраmoveax,1; системний виклик № 1 (sys_exit)movebx,0; код повернення 0int0x80; виклик ядра
**********************************HELLOWORLDFOR6502**APPLE][,MERLINASSEMBLER**********************************STROUTEQU$DB3A; виводить текстовий рядок, адресований AYLDY#>HELLO ; завантажити старшу частину адреси тексту в регістр YLDA#<HELLO ; завантажити молодшу частину адреси тексту в регістр AJMPSTROUT; перейти на підпрограму виведення рядкаHELLOASC"HELLOWORLD!",00
↑Booth, A.D.; Britten, K.H.V. (September 1947). Coding for the ARC(PDF). Birkbeck College, London. Архів оригіналу(PDF) за 24 березня 2020. Процитовано 23 липня 2017.
↑Campbell-Kelly, Martin (April 1982). The Development of Computer Programming in Britain (1945 to 1955). IEEE Annals of the History of Computing. 4 (2): 121—139. doi:10.1109/MAHC.1982.10016.