GNU Assembler


The GNU Assembler, commonly known as gas or simply as, its executable name, is the assembler used by the GNU Project. It is the default back-end of GCC. It is used to assemble the GNU operating system and the Linux kernel, and various other software. It is a part of the GNU Binutils package.
The GAS executable is named as, the standard name for a Unix assembler. GAS is cross-platform, and both runs on and assembles for a number of different computer architectures. Released under the GNU General Public License v3, GAS is free software.

History

The first version of GAS was published c. 1986-1987. It was written by Dean Elsner, and supported the VAX architecture.

General syntax

GAS supports a general syntax that works for all of the supported architectures. The general syntax includes assembler directives and a method for commenting.

Directives

GAS uses assembler directives, which are keywords beginning with a period that behave similarly to preprocessor directives in the C programming language. While most of the available assembler directives are valid regardless of the target architecture, some directives are machine dependent.

Comments

GAS supports two comment styles:

Multi-line comments

As in C multi-line comments start and end with mirroring slash-asterisk pairs:

/*
comment
  • /

Single-Line comments

Single line comments have a few different formats varying on which architecture is being assembled for.
Being the back-end for a popular compiler suite, namely GCC, the GNU Assembler is very widely used in compiling modern open source software. GAS is often used as the assembler on GNU/Linux operating systems in conjunction with other GNU software. A modified version of GAS can also be found in the Macintosh operating system's development tools package since OS X.

Example program

A standard “Hello, world!” program for Linux on IA-32 using the default AT&T syntax:

.global _start
.text
_start:
movl $4, %eax # 4 -> EAX register
movl $1, %ebx # 1 -> EBX
movl $msg, %ecx # address of msg string -> ECX
movl $len, %edx # len -> EDX
int $0x80 # interrupt with location 0x80, which invokes the kernel's system call procedure
movl $1, %eax # 1 -> EAX
movl $0, %ebx # 0 -> EBX
int $0x80 # see previous
.data
msg:
.ascii "Hello, world!\n" # inline ascii string
len = . - msg # assign value of to symbol "len"

Intel syntax

Since version 2.10, Intel syntax can be used through use of the .intel_syntax directive.