GNU Assembler

GNU Assembler (GAS)
Логотип программы GNU Assembler (GAS)
Тип ассемблер
Разработчик Фонд свободного ПО
Написана на C
Операционная система кроссплатформенное ПО
Первый выпуск 1986
Аппаратная платформа кроссплатформенное ПО
Последняя версия
  • toolset version of binutils[1]
Лицензия GPL 3
Сайт gnu.org/software/binutil…

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_syntax noprefix
  mov eax, 42

равноценен коду с AT&T-синтаксисом, указанному выше.

Примеры

Ниже приведены примеры программы Hello, world! для GAS под Linux.

Hello, world! для Linux x86 (AT&T-синтаксис)
.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        # вызов ядра
Hello, world! для Linux x86 (Intel-синтаксис с префиксом)
.intel_syntax
.data
msg:
    .ascii "Hello, world!\n"
    len = . - msg      # символу len присваивается длина строки

.text
    .global _start     # точка входа в программу
_start:
    mov  %eax, 4       # системный вызов № 4 — sys_write
    mov  %ebx, 1       # поток № 1 — stdout
    mov  %ecx, OFFSET FLAT:msg   # указатель на выводимую строку
                       # OFFSET FLAT означает использовать тот адрес,
                       # который msg будет иметь во время загрузки
    mov  %edx, len     # длина строки
    int  0x80          # вызов ядра

    mov  %eax, 1       # системный вызов № 1 — sys_exit
    xor  %ebx, %ebx    # выход с кодом 0
    int  0x80          # вызов ядра
Hello, world! для Linux ARM (EABI)
.data
msg:
    .ascii "Hello, world!\n"
    len = . - msg   @ в GAS для ARM комментарии начинаются с @ или заключаются в /* */

.text
    .global _start  @ точка входа в программу
_start:
    mov  r7, #4     @ системный вызов  4  sys_write
    mov  r0, #1     @ поток  1  stdout
    ldr  r1, =msg   @ указатель на выводимую строку
    ldr  r2, =len   @ длина строки
    swi  #0         @ вызов ядра

    mov  r7, #1     @ системный вызов  1  sys_exit
    mov  r0, #0     @ выход с кодом 0
    swi  #0         @ вызов ядра

Примечания

  1. https://sourceware.org/git/?p=binutils-gdb.git;a=tree
  2. Linux Assembly HOWTO: GAS (англ.). Дата обращения: 18 июля 2010. Архивировано из оригинала 22 марта 2012 года.
  3. Using as: The GNU Assembler (англ.). Дата обращения: 18 июля 2010. Архивировано из оригинала 22 марта 2012 года.
  4. gas/NEWS (англ.). Дата обращения: 17 июля 2010. Архивировано из оригинала 18 февраля 2012 года.

Ссылки

  • Сайт GNU Binutils  (англ.)
  • Linux Assembly HOWTO  (англ.)
  • The Art of Assembly Language (Linux Version)  (англ.)
  • Ассемблеры для Linux: Сравнение GAS и NASM
  • as(1): the portable GNU assembler — страница справки man по пользовательским командам GNU/Linux  (англ.)
Перейти к шаблону «Ассемблеры»
IDE
Трансляторы
Форматы синтаксиса