Меню

Главная
Случайная статья
Настройки
GNU Assembler
Материал из https://ru.wikipedia.org

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        # вызов ядра
Downgrade Counter