Мова асемблера

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Мова асемблера
Motorola 6800 Assembly Language.png
мова програмування і неструктурована мова програмування[d]
Дата появи: 1949
Звичайні розширення файлів: asm
Just Solve the File Format Problem Assembly_language
CMNS: Мова асемблера на Вікісховищі
Лістинг Motorola MC6800 Assembly, який показує оригінальний текст програми та згенеровані машинні коди

Асе́мблер, Мова асемблера (англ. assembler; assembly language) — мова програмування низького рівня для програмованої обчислювальної системи (мікропроцесора, мікроконтролера, комп'ютера або іншого програмованого пристрою), в якій існує строга відповідність між операторами мови та машинними командами[1]. Асемблер також називають символічним машинним кодом або мнемокодом.

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

Програма мовою асемблера перетворюється у виконуваний машинний код за допомогою утиліти, названої Асемблер. Процес перетворення називають асемблюванням або збіркою (англ. assembly, assembling). У більшості випадків цей процес відбувається у два етапи: асемблювання і компонування[2] (англ. linking).

Асемблер[ред.ред. код]

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

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

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

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

Асемблер (assembler) — система програмування, яка включає мову асемблера та транслятор з цієї мови. Є мовою програмування низького рівня. Чим нижчий рівень мови програмування, тим ближча специфіка роботи програми до самого процесора, для якого вона й була написана. Вважається, що мови низького рівня складніші й потребують більш вузької спеціалізації програміста, оскільки програма написана на асемблері для одного типу процесорів виявиться не завжди придатною для роботи з іншими процесорами. З іншого боку програми написані на асемблері компактні та швидкі, що теж є немаловажливим.

Поки існують процесори, буде існувати й асемблер.

Опис мови асемблера[ред.ред. код]

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

Переваги і недоліки[ред.ред. код]

  • мінімальна кількість надлишкового коду (використання меншої кількості команд та звернень в пам'ять). Як наслідок — велика швидкість і менший розмір програми;
  • великі обсяги коду, велике число додаткових дрібних завдань;
  • погана читабельність коду, труднощі підтримки (налагодження, додавання можливостей);
  • труднощі реалізації парадигм програмування та будь-яких інших скільки-небудь складних конвенцій, складність спільної розробки;
  • меншу кількість доступних бібліотек, їх мала сумісність;
  • безпосередній доступ до апаратури: портам введення-виведення, особливим регістрам процесора;
  • можливість написання коду, мета програмування, якого немає необхідності програмного інтерпретатора;[джерело?]
  • максимальна «підгонка» для потрібної платформи (використання спеціальних інструкцій, технічних особливостей «заліза»);
  • неможливість роботи на платформах з іншою (несумісною) архітектурою.

Директиви[ред.ред. код]

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

  • визначення даних (констант і змінних);
  • управління організацією програми в пам'яті і параметрами вихідного файлу;
  • завдання режиму роботи компілятора;
  • всілякі абстракції (тобто елементи мов високого рівня) — від оформлення процедур і функцій (для спрощення реалізації парадигми процедурного програмування) до умовних конструкцій і циклів (для парадигми структурного програмування);
  • макроси;

Синтаксис[ред.ред. код]

Елементи синтаксису[ред.ред. код]

Комментар до кінця рядка ; ! / #
Регістрозалежність ні
Послідовність кінець рядка

Intel-синтаксис[ред.ред. код]

Intel-синтаксис є одним з найпоширеніших, використовується для IBM-сумісних комп'ютерів.

AT&T-синтаксис[ред.ред. код]

Відрізняється від Intel-синтаксису наявність суфіксів до мнемонік та префіксів до операндів.

main () 
{ 
        int a = 1; // оголошуємо змінну a і кладемо туди значення 1 
        int b = 2; // оголошуємо змінну b і кладемо туди значення 2 
        int c; // оголошуємо змінну c, але не ініціалізуємо її 
        // Початок асемблерної вставки 
        __asm{ 
                mov eax, a // завантажуємо значення змінної a в регістр EAX 
                mov ebx, b // завантажуємо значення змінної b в регістр EBX 
                add eax, ebx // додаємо EAX з EBX, записуючи результат в EAX 
                mov c, eax // завантажуємо значення EAX у змінну c 
        } 
        // Кінець асемблерної вставки 
        // Виводимо вміст c на екран 
        // За допомогою звичної функції printf 
        printf ("a + b =% x +% x =% x \ n", a, b, c); 
}

Використання мови[ред.ред. код]

Історичні відомості[ред.ред. код]

Мови асемблера, так само як і використання слова assembly, беруть свій початок від перших ЕОМ зі збереженням програми. Один з перших асемблерів було розроблено у 1947 році Катлін Бут (Kathleen Booth) для машини ARC2 в університеті Біркбек (Лондон), після консультацій з Джоном фон Нойманом і Германом Ґолдстіном у Інституті перспективних досліджень.[3][4] Машина EDSAC у 1949 році мала асемблер під назвою initial orders з однолітерними мнемоніками.[5] Для машин IBM 650 існувала програма SOAP (Symbolic Optimal Assembly Program), написана Стеном Полі (Stan Poley) у 1955-му.[6]

Мови асемблера дозволили вивільнити програмістів від надзвичайно низькорівневих, рутинних і втомливих «ручних» процедур, яких потребували перші комп'ютери —запам'ятовування людиною кодів команд, адрес, ручного обчислення адрес переходів (і зміни їх при кожному додаванні чи вилученні команд), представлення чисел тощо. Приблизно до середини 1980-х років асемблери широко використовувалися у програмуванні — як для великих ЕОМ (мейнфреймів), так і для персональних і мікрокомп'ютерів. Втім, прогрес у розвитку процесорів і пам'яті спричинив активний прогрес методів компіляції з високорівневих мов і появу компіляторів, що значно підвищували продуктивність роботи програміста. У 21-му столітті мови асемблера використовуються там, де потрібне пряме керування апаратурою, доступ до спеціалізованих інструкцій процесора чи співпроцесорів, або для кодування критичних (до часу чи розміру) секцій програми. Типовими сферами застосування асемблера є драйвери пристроїв, вбудовані системи, системи реального часу, ядра ОС, резидентні монітори тощо.

Багато важливих програм було написано цілком на мові асемблера (лише у 1961-му з'явилася перша операційна система Burroughs MCP, написана частково на мові високого рівня (алголоподібний ESPOL). Велика кількість комерційного програмного забезпечення для мейнфреймів IBM також написана на асемблері.

Більшість ранніх мікрокомп'ютерів, обмежених у оперативній пам'яті, потребувало програмного забезпечення, написаного вручну майже виключно на асемблері, включно з кодом BIOS, дискової операційної системи і великої кількості прикладних програм. Типовими прикладами великих асемблерних програм 1970-80-х років є BIOS і DOS для комп'ютерів IBM PC, компілятор Turbo Pascal, перші програми електронних таблиць (наприклад, Lotus 1-2-3), численні комп'ютерні ігри.

Застосування у нинішній час[ред.ред. код]

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

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

Приклади застосувань[ред.ред. код]

  • Гіпервізори
  • Реалізація криптографічних і інших специфічних алгоритмів (наприклад, цифрового перетворення сигналів)
  • Фрагменти ядер ОС, або цілі мікроядра (приклади: ранні L3, L4)
  • Початкові завантажники, Firmware, резидентні монітори, BIOS
  • Результат роботи компілятора (коли компілятор генерує не об'єктний код, а текст на мові асемблера), який можна переглянути і при потребі змінити
  • Inline-інтегрування асемблерних команд безпосередньо в тіло програми на мові високого чи середнього рівня (C, Паскаль)
  • Низькорівневі віруси чи руткіти
  • Машинний код, що модифікує сам себе
  • Реверс-інженеринг
  • Програми, повністю незалежні від основних системних бібліотек (таких як libc чи crt0)
  • Різні типи оптимізації, що з тих чи інших причин недоступні при кодуванні на мові високого рівня

Приклади[ред.ред. код]

Приклади програми Hello, World! для різних платформ і асемблерів.

EXE-програма на TASM для MS-DOS, платформа Intel x86

  • tasm hello.asm
  • tlink hello.obj
.model small                    ; модель пам'яті
.data                           ; сегмент даних
msg db 'Hello, World',13,10,'$' ; текстове повідомлення

.code                           ; сегмент коду
start:                          ; точка входу в програму 
        mov ax, @data           ; налаштування сегментного
        mov ds, ax              ; регістру даних
        mov ah, 09h             ; функція DOS № 9 – вивести рядок
        lea dx, msg             ; адреса текстового повідомлення
        int 21h                 ; виклик переривання DOS
        mov , 4Ch             ; Функція DOS № 4Ch – завершити програму 
        mov al, 0               ; код повернення 0
        int 21h                 ; виклик переривання DOS
end start

Програма на NASM для Linux, платформа Intel x86

  • nasm –f elf –o hello.o hello.asm
  • ld -o hello hello.o
SECTION .data                   ; сегмент даних
msg  db "Hello, world!", 10     ; текстовий рядок
len     equ $ - msg             ; довжина рядка

SECTION .text                   ; сегмент коду
global _start
_start:                         ; точка входу в програму                      
        mov eax, 4              ; системний виклик № 4 (sys_write)
        mov ebx, 1              ; номер пристрою (stdout)
        mov ecx, msg            ; текстове повідомлення
        mov edx, len            ; довжина повідомлення
        int 0x80                ; виклик ядра
        mov eax, 1              ; системний виклик № 1 (sys_exit)
        mov ebx, 0              ; код повернення 0
        int 0x80                ; виклик ядра

Програма на асемблері 6502 для Apple II

*********************************
*     HELLO WORLD FOR 6502      *
*   APPLE ][, MERLIN ASSEMBLER  *
*********************************

STROUT 	EQU     $DB3A           ; виводить текстовий рядок, адресований AY
        LDY     #>HELLO         ; завантажити старшу частину адреси тексту в регістр Y
        LDA     #<HELLO         ; завантажити молодшу частину адреси тексту в регістр A
        JMP     STROUT          ; перейти на підпрограму виведення рядка

HELLO	ASC	"HELLO WORLD!",00

Див. також[ред.ред. код]

Джерела[ред.ред. код]

Примітки[ред.ред. код]

  1. Дудзяний І.М., Черняхівський В.В. Програмування мовою асемблера. — Львів : ЛНУ імені Івана Франка, 2002.
  2. Магда Ю. С. Ассемблер для процессоров Intel Pentium. – СПб.: Питер, 2006.
  3. Booth, A.D.; Britten, K.H.V. (September 1947). Coding for the ARC. Birkbeck College, London. Процитовано 23 July 2017. 
  4. 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. 
  5. Salomon. Assemblers and Loaders. с. 7. Процитовано 2012-01-17. 
  6. The IBM 650 Magnetic Drum Calculator. Процитовано 2012-01-17. 

Посилання[ред.ред. код]

  • Assembler.com.ua(рос.) — сайт присвячений урокам програмування на асемблері.