GNU Assembler | это... Что такое GNU Assembler? (original) (raw)

GNU Assembler (GAS)

Тип ассемблер
Разработчик Фонд свободного ПО
Написана на C
Операционная система кроссплатформенное ПО
Аппаратная платформа кроссплатформенное ПО
Последняя версия 2.20.1 (3 марта 2010)
Лицензия GPL 3
Сайт gnu.org/software/binutils/

GNU Assembler или GAS (вызывается командой as) — ассемблер проекта GNU; используется компилятором GCC[1]. Входит в пакет GNU Binutils. Кроссплатформенная программа, запускается под и компилирует код для многочисленных процессорных архитектур. Распространяется на условиях свободной лицензии GPL 3.

Синтаксис

Синтаксис и директивы GAS на всех платформах в значительной степени схожи[2]. Директивы начинаются с точки. Многострочные комментарии обозначаются как в Си (/* … */). Однострочные комментарии на разных платформах обозначаются по-разному; например, в GAS для x86 и x86-64 они обозначаются как в C++ (// …) или как в sh (# …), в то время как в GAS для ARM они обозначаются символом @.

По умолчанию, GAS использует AT&T-синтаксис для x86 и x86-64, то есть регистры обозначаются префиксом % и регистр-приёмник указывается после источника; например код

помещает значение 42 в регистр eax.

В версии 2.10 (выпущенной в 2000 году) появилась поддержка варианта более привычного для x86 Intel-синтаксиса[3], вызываемого директивой .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. Linux Assembly HOWTO: GAS (англ.). Архивировано из первоисточника 23 марта 2012. Проверено 18 июля 2010.
  2. Using as: The GNU Assembler (англ.). Архивировано из первоисточника 23 марта 2012. Проверено 18 июля 2010.
  3. gas/NEWS (англ.). Архивировано из первоисточника 18 февраля 2012. Проверено 17 июля 2010.

Ссылки

Просмотр этого шаблона Язык ассемблера
IDE RadASMWinAsm • ASMedit • Easy Code • Fresh • GSS Visual Assembler
Трансляторы MASMGASfasmNASMRosASMTASMYasmHLASM
Форматы синтаксиса AT&T-синтаксисIntel-синтаксис