Assembler - язык неограниченных возможностей

             

Основные правила


Итак, в ассемблере AT&T в качестве допустимых символов в тексте программы рассматриваются только латинские буквы, цифры и символы «%» (процент) «$» (доллар), «*» (звездочка) , «.» (точка), «,» (запятая) и «_» (подчеркивание). Помимо них существуют символы начала комментария, различные для разных ассемблеров и различные для комментария размером в целую строку или правую часть строки. Любые другие символы, кроме кавычек, двоеточия, пробела и табуляции, если они не часть комментария или не заключены в кавычки, считаются ошибочными.

Если последовательность допустимых символов, с которой начинается строка, не начинается со специального символа или цифры и не заканчивается двоеточием — это команда процессора:

// остановить процессор hlt

Если последовательность допустимых символов начинается с символа «%» — это название регистра процессора:

// поместить в стек содержимое регистра ЕАХ pushl %eax

Если последовательность начинается с символа «$» — это непосредственный операнд:

// поместить в стек 0, число 10h и адрес переменной variable pushl $0 pushl $0x10 pushl $variable

Если последовательность символов начинается с точки — это директива ассемблера:

.align 2

Если последовательность символов, с которой начинается строка, заканчивается двоеточием — это метка (внутренняя переменная ассемблера, значение которой соответствует адресу в указанной точке):

eternal_loop: jmp eternal_loop variable: .byte 7

Метки, состоящие из одной цифры от 0: до 9:, используются как локальные — обращение к метке 1f соответствует обращению к ближайшей из меток 1: вперед по тексту программы, обращение к метке 4b соответствует обращению к ближайшей из меток 4: назад по тексту программы.

Одни и те же метки могут использоваться без ограничений и как цель для команды перехода, и как переменные.

Специальная метка «.» (точка) всегда равна текущему адресу (в точности как «$» в ассемблерах для DOS/Windows).

Если последовательность символов начинается с символа «*» — это абсолютный адрес (для команд jmp и call), иначе — относительный.



Содержание раздела