Interested Article - GNU Assembler
- 2020-12-05
- 2
GNU Assembler или GAS (вызывается командой ) — ассемблер проекта GNU ; используется компилятором GCC . Входит в пакет GNU Binutils . Кроссплатформенная программа , запускается и компилирует код для многочисленных процессорных архитектур. Распространяется на условиях свободной лицензии GPL 3 .
Синтаксис
Синтаксис и
директивы
GAS на всех платформах в значительной степени схожи
. Директивы начинаются с точки. Многострочные комментарии обозначаются как в Си (
/* … */
). Однострочные комментарии на разных платформах обозначаются по-разному; например, в GAS для x86 и x86-64 они обозначаются как в C++ (
// …
) или как в
sh
(
# …
), в то время как в GAS для
ARM
они обозначаются символом
@
.
По умолчанию, GAS использует
AT&T-синтаксис
для x86 и x86-64, то есть регистры обозначаются префиксом
%
и
регистр
-приёмник указывается после источника; например код
movl $42, %eax
помещает значение 42 в регистр eax.
В версии 2.10 (выпущенной в 2000 году) появилась поддержка варианта более привычного для x86
Intel-синтаксиса
, вызываемого директивой
.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 # вызов ядра
.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 # вызов ядра
.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 @ вызов ядра
Примечания
- (англ.) . Дата обращения: 18 июля 2010. Архивировано из 22 марта 2012 года.
- (англ.) . Дата обращения: 18 июля 2010. Архивировано из 22 марта 2012 года.
- (англ.) . Дата обращения: 17 июля 2010. Архивировано из 18 февраля 2012 года.
Ссылки
- 2020-12-05
- 2