GNU Assembler , широко известный как gas или as , — это ассемблер, разработанный в рамках проекта GNU Project . Это серверная часть GCC по умолчанию . Он используется для сборки операционной системы GNU и ядра Linux , а также различного другого программного обеспечения. Это часть пакета GNU Binutils .
Исполняемый файл GAS имеет имя , стандартное имя ассемблера Unix . GAS является кроссплатформенным , работает и собирается для различных компьютерных архитектур . GAS — это бесплатное программное обеспечение , выпущенное под лицензией GNU General Public License v3.
Первая версия ГАС вышла в 1986–1987 годах. [2] Он был написан Дином Элснером и поддерживал архитектуру VAX . [2]
GAS поддерживает общий синтаксис, который работает для всех поддерживаемых архитектур. Общий синтаксис включает директивы ассемблера и метод комментирования. Синтаксис по умолчанию — синтаксис AT&T .
GAS использует директивы ассемблера (также известные как псевдооперации), которые представляют собой ключевые слова, начинающиеся с точки и ведущие себя аналогично директивам препроцессора в языке программирования C. Хотя большинство доступных директив ассемблера действительны независимо от целевой архитектуры, некоторые директивы зависят от машины. [3]
Начиная с версии 2.10, синтаксис Intel можно использовать с помощью директивы .intel_syntax
. [4] [5] [6]
GAS поддерживает два стиля комментариев. [7]
Многострочный
Как и в C, многострочные комментарии начинаются и заканчиваются зеркальным отображением пар косой черты и звездочки:
/* комментарий */
Одна линия
Однострочные комментарии имеют несколько разных форматов, зависящих от архитектуры, для которой они собираются.
Являясь серверной частью популярного пакета компиляторов, а именно GCC, GNU Assembler очень широко используется при компиляции современного программного обеспечения с открытым исходным кодом. GAS часто используется в качестве ассемблера в операционных системах Linux в сочетании с другим программным обеспечением GNU. Модифицированную версию GAS также можно найти в пакете инструментов разработки macOS , начиная с OS X.
Стандартное «Привет, мир!» программа для Linux на I386 :
.global _start.text _start: movl $4 , %eax # 4 (код для системного вызова «записи») -> регистр EAX movl $1 , %ebx # 1 (дескриптор файла для стандартного вывода) -> EBX (1-й аргумент системного вызова) movl $msg , % ecx # 32-битный адрес строки сообщения -> ECX (2-й аргумент) movl $len , %edx # длина строки сообщения -> EDX (3-й аргумент) int $0x80 # прерывание с адресом 0x80 (128), которое вызывает процедура системного вызова movl $1 , %eax # 1 ("выход") -> EAX movl $0 , %ebx # 0 (с успехом) -> EBX int $0x80 # см. предыдущий .data msg: .ascii "Hello, world!\n" # встроенная строка ascii len = . - msg # присвоить (текущий адрес - адрес начала сообщения) символу "len"