GNU Assembler или GAS (вызывается командой as) — ассемблер проекта GNU; используется компилятором GCC[2]. Входит в пакет GNU Binutils. Кроссплатформенная программа, запускается и компилирует код для многочисленных процессорных архитектур. Распространяется на условиях свободной лицензии GPL 3.
Синтаксис и директивы GAS на всех платформах в значительной степени схожи[3]. Директивы начинаются с точки. Многострочные комментарии обозначаются как в Си (/* … */). Однострочные комментарии на разных платформах обозначаются по-разному; например, в GAS для x86 и x86-64 они обозначаются как в C++ (// …) или как в sh (# …), в то время как в GAS для ARM они обозначаются символом @.
По умолчанию, GAS использует AT&T-синтаксис для x86 и x86-64, то есть регистры обозначаются префиксом % и регистр-приёмник указывается после источника; например код
movl$42,%eax
помещает значение 42 в регистр eax.
В версии 2.10 (выпущенной в 2000 году) появилась поддержка варианта более привычного для x86 Intel-синтаксиса[4], вызываемого директивой .intel_syntax noprefix (директива .intel_syntax используется для варианта Intel-синтаксиса, в котором регистры обозначаются префиксом %). Например, код
.intel_syntaxnoprefixmoveax,42
равноценен коду с AT&T-синтаксисом, указанному выше.
.datamsg:.ascii"Hello, world!\n"len=.-msg# символу len присваивается длина строки.text.global_start# точка входа в программу_start:movl$4,%eax# системный вызов № 4 — sys_writemovl$1,%ebx# поток № 1 — stdoutmovl$msg,%ecx# указатель на выводимую строкуmovl$len,%edx# длина строкиint$0x80# вызов ядраmovl$1,%eax# системный вызов № 1 — sys_exitxorl%ebx,%ebx# выход с кодом 0int$0x80# вызов ядра
Hello, world! для Linux x86 (Intel-синтаксис с префиксом)
.intel_syntax.datamsg:.ascii"Hello, world!\n"len=.-msg# символу len присваивается длина строки.text.global_start# точка входа в программу_start:mov%eax,4# системный вызов № 4 — sys_writemov%ebx,1# поток № 1 — stdoutmov%ecx,OFFSETFLAT:msg# указатель на выводимую строку# OFFSET FLAT означает использовать тот адрес,# который msg будет иметь во время загрузкиmov%edx,len# длина строкиint0x80# вызов ядраmov%eax,1# системный вызов № 1 — sys_exitxor%ebx,%ebx# выход с кодом 0int0x80# вызов ядра