GNU Assembler
The GNU Assembler, commonly known as gas or as, is the assembler developed 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, the standard name for a Unix assembler. GAS is cross-platform, and both runs on and assembles for a number of different computer architectures. GAS is free software released under the GNU General Public License v3.
History
The first version of GAS was released in 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. The default syntax is AT&T syntax.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.Since version 2.10, Intel syntax can be used through use of the
.intel_syntax directive.Comments
GAS supports two comment styles.Multi-line
As in C, multi-line comments start and end with mirroring slash-asterisk pairs:
/*
comment
- /
Single-line
Single line comments have a few different formats varying on which architecture is being assembled for.
- A hash symbol — i386, x86-64, i960, 68HC11, 68HC12, VAX, V850, M32R, PowerPC, MIPS, M680x0, and RISC-V
- A semicolon — AMD 29k family, ARC, H8/300 family, HPPA, PDP-11, picoJava, Motorola, and M32C
- The at sign — 32-bit ARM
- A double slash — AArch64
- A vertical bar — M680x0
- An exclamation mark — Renesas SH
Usage
Example program
A standard "Hello, world!" program for Linux on IA-32:.global _start
.text
_start:
movl $4, %eax # 4 -> EAX register
movl $1, %ebx # 1 -> EBX
movl $msg, %ecx # 32-bit address of msg string -> ECX
movl $len, %edx # length of msg string -> 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 to symbol "len"