Мова асемблера 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-синтаксис є одним з найпоширеніших, використовується для IBM-сумісних комп'ютерів.

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); }

Джерела