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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

Асе́мблер (англ. 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); 
}

Програмні пакети для програмування на мові асемблера[ред.ред. код]

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

Мову асемблера люди почали використовувати з 1950 року. Ця мова перший дозволив відображати двійковий код в більш зручній для людини формі: у вигляді букв або укорочених слів, які приблизно позначали сутність команди.

Інколи постає необхідність використання асемблера при програмування на мовах високого рівня, часто при зверненні до апаратного забезпечення. Наступний приклад демонструє додавання двох чисел на мові С з використанням вставки мови асемблера у середовищі Microsoft Visual C++[1].

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

Крім того, на асемблері створюються цілі операційні системи, прикладом може стати Menuet OS. Не варто забувати, що у хакерів цю мову так само користується популярністю, та ще й який! Але що ж їм так подобатися в ньому? Звичайно ж, те, що швидкість роботи отриманої програми значно вище швидкості програми написаної мовою програмування високого рівня. Це пояснюється тим, що розмір, що вийшов програми дуже малий. А як же розробники антивірусних програм? Вони теж не ликом шиті і так само використовують асемблер в деяких модулях своїх програм, що так само забезпечує їх швидкодію. А якби не асемблер деякі програми завантажувалися б близько години! Так що асемблер воістину вічна мова, і ще багато років він буде служити людству!

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

Hello, World![ред.ред. код]

Приклад для версії Intel x86 (IA32)

MSDOS

mov ax,cs
mov ds,ax mov ah,9 
mov dx, offset Hello 
int 21h xor ax,ax 
int 21h

 Hello:

 db "Hello World!",13,10,"$"

Приклад для NASM Linux, використовуеться Intel синтакс:

  • nasm –f elf –o hello.o hello.asm
  • ld -o hello hello.o
SECTION .data 
msg  db "Hello, world!",0xa  
len     equ $ - msg 
SECTION .text 
global _start           
_start:                      ; Точка входа в программу                      mov eax, 4      ; 'write' системный вызов       mov ebx, 1             
mov ecx, msg    ; Указатель на данные        
mov edx, len    ; Количество данных        
int 0x80        ;Вызов ядра        
mov eax, 1      ; '_exit' системный вызов         
mov ebx, 0      ; Возвращаем 0 (все хорошо)        
int 0x80        ; Вызов ядра

Приклад для версії Apple II:

******************************** 
* HELLO WORLD FOR 6502 APPLE ][ *
******************************** 
STROUT    EQU     $DB3A            
       LDY        #>HELLO       
       LDA        #<HELLO       
       JMP        STROUT

 HELLO    ASC     "HELLO WORLD!",00

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

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

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

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