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

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

Мова асемблера x86 — загальна назва групи асемблерних мов, що беруть свій початок від перших мов асемблера мікропроцесорів Intel 8086 та Intel 8088 і забезпечують деякий рівень сумісності на рівні початкових текстів програм. У порівнянні з мовами асемблера інших процесорів, відмінною рисою асемблерів для архітектури x86 є наявність двох цілком відмінних синтаксисів, зумовлених історичними особливостями розвитку двох важливих для цієї комп'ютерної платформи операційних систем (MS-DOS і Unix). Також слід відзначити наявність кількох реалізацій програм-асемблерів, кожна з яких може мати несумісні з іншими особливості (такі як макроси, препроцесор, адресування змінних та інше).

Мнемоніки та коди операцій

[ред. | ред. код]

Синтаксис

[ред. | ред. код]

Елементи синтаксису

[ред. | ред. код]

Набір команд

[ред. | ред. код]

Типовими командами мови асемблера є:

  • Команди пересилки даних (mov та ін.);
  • Арифметичні команди (add, sub, та ін.);
  • Логічні та побітові операції (or, and, xor, shr, ror та ін.);
  • Команди управління ходом виконання програми (jmp, loop, ret та ін.);
  • Команди виклику переривань (іноді відносять до команд управління): int;
  • Команди вводу-виводу в порти (in, out);
  • Для мікроконтролерів і мікрокомп'ютерів характерні також команди, що виконують перевірку і перехід по умові, наприклад деякі з них:
    • cjne — перейти, якщо не дорівнює;
    • djnz — декрементувати, і якщо результат ненульовий, то перейти;
    • cfsneq — порівняти, і якщо не дорівнює, пропустити наступну команду.

Синтаксис мови асемблера визначається системою команд конкретного процесора чи мікроконтролера.

Intel-синтаксис

[ред. | ред. код]
Докладніше: Синтаксис Intel

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

AT&T-синтаксис

[ред. | ред. код]
Докладніше: Синтаксис AT&T

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

Асемблерні фрагменти у мові C

[ред. | ред. код]
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); 
}

Джерела

[ред. | ред. код]