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