

МИЭТ, СПИНТех, КАИ |
Введение в GNU Assembler |
1 / 19 |
Введение в GNU Assembler
Александра Игоревна Кононова
МИЭТ
11 сентября 2021 г. актуальную версию можно найти на https://gitlab.com/illinc/arch-cs
GNU Assembler (GAS) Функции Синтаксис: AT&T vs Intel
Целочисленная арифметика

|
МИЭТ, СПИНТех, КАИ |
Введение в GNU Assembler |
|
2 / 19 |
GNU Assembler (GAS) |
|
|
|
|
1 |
Является частью сборочного процесса C/C++: |
|
|
|
|
сборка g++/gcc, расширение .S (препроцессор C + сборка), .s: |
|||
|
g++ main.S; g++ main1.S lib1.cpp; |
g++ main2.cpp lib2.S; |
||
|
комментарии /* в стиле C */ и // C++; |
|
|
|
|
ЗАГЛАВНЫЕ/строчные различаются (но не в рег./мнем./дир.); |
|||
|
литералы C/C++ (0xFF, 0b1100, 3*16+8, ’f’, "hello"); |
|||
|
libc (stdlib) подключена по умолчанию main(); printf() etc (все C). |
|||
2 |
Строка=оператор; синтаксис AT&T (Intel .intel_syntax noprefix): |
.директива .data/.text, .globl, типоразмеры:
.byte, .short, .int/.long, .quad, .float/.single, .double, .string/.asciz, .ascii
[метка:] типоразмер [значения] [метка:] мнемоника[суффикс] [неп-й,] [источник,] [приёмник]
cуффиксы мнемоник (не FPU), бит: b=8, s=16, w=16, l=32, q=64 cуффиксы movs/movz (источник-приёмник): bw, bl, bq, wl, wq, lq
префиксы операндов: %регистр, $непосредственный, память
GNU Assembler (GAS) |
Сборка |
|
} Минимальная программа (почти кроссплатформенно) |
||
Функции |
||
Синтаксис: AT&T vs Intel |
} Приветствие миру (GNU/Linux 64) |
|
Целочисленная арифметика |
Адресация операндов |
|
Ограничения архитектуры x86 } |
||
|

МИЭТ, СПИНТех, КАИ |
Введение в GNU Assembler |
3 / 19 |
Сборка
g++ prog1.cpp prog2.S
g++ -o prog prog1.cpp prog2.S
prog1.cpp |
|
prog2.S |
|
|
|
|
|
|
|
|
|
Заголовочные |
|
|
|
||
|
Препроцессор |
|
|
|
Препроцессор |
||||||
|
|
|
файлы (#include) |
|
|||||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Временный |
|
|
|
|
|
|
|
Временный |
||
|
файл (stdout) |
|
|
|
|
|
|
|
файл (stdout) |
||
|
|
|
|
|
Декорирование |
|
|
|
|||
|
|
|
|
|
|
||||||
|
Компилятор |
|
|
int foo(int x) |
|
|
|
||||
|
|
|
|
|
! _Z3fooi |
|
|
|
|||
|
|
|
|
|
|
||||||
|
prog1.s |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ассемблер |
|
|
|
|
|
|
|
Ассемблер |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
prog1.o |
|
|
|
|
|
|
|
prog2.o |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Компоновщик |
|
|
|
Компоновщик |
|
Компоновщик |
||||
g++ |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|||
|
|
|
prog |
|
|
|
|
||||
|
extern |
|
|
|
|
|
|
|
.globl |
Общие фрагменты (#include)
Объектные файлы библиотек
(в т. ч. libc=stdlib)
GNU Assembler (GAS) |
Сборка |
|
} Минимальная программа (почти кроссплатформенно) |
||
Функции |
||
Синтаксис: AT&T vs Intel |
} Приветствие миру (GNU/Linux 64) |
|
Целочисленная арифметика |
Адресация операндов |
|
Ограничения архитектуры x86 } |
||
|

МИЭТ, СПИНТех, КАИ |
Введение в GNU Assembler |
4 / 19 |
} Минимальная программа (*)
min.S
GNU/Linux, BSD (кроме MacOS X) 32/64; MS Windows 64
1 .globl main // указание компоновщику
2 main: |
// начало main |
3xor %eax; %eax // 32: 0 ! eax; 64: 0 ! eax ! rax (рек.)
4ret // возврат из main
ВMS Windows 32 и MacOS X любой разрядности в обоих местах _main (см. искажение имён и макрос FUNC_NAME).
Эквивалент на С++: int main(){ return 0; }
Целочисленное возвращаемое значение по всем соглашениям передаётся через регистр A (eax в *32, rax в *64)
Сборка: g++ min.S
GNU Assembler (GAS) |
Сборка |
|
} Минимальная программа (почти кроссплатформенно) |
||
Функции |
||
Синтаксис: AT&T vs Intel |
} Приветствие миру (GNU/Linux 64) |
|
Целочисленная арифметика |
Адресация операндов |
|
Ограничения архитектуры x86 } |
||
|

МИЭТ, СПИНТех, КАИ |
Введение в GNU Assembler |
5 / 19 |
|
} Приветствие миру (GNU/Linux 64) |
|
||
.data |
|
|
|
msg: .string "Hello, world!\n" |
|
||
.text |
|
|
|
.globl main |
|
|
|
main: |
выравнивание sp на 16 после call main |
|
|
sub $8, %rsp |
|
||
lea msg(%rip), %rdi |
printf(msg) |
|
|
call printf |
|
|
|
восстановление sp перед ret из main |
|
||
add $8, %rsp |
|
||
xor %eax, %eax |
return 0 из main() |
|
|
|
|
ret
GNU Assembler (GAS) |
Сборка |
|
} Минимальная программа (почти кроссплатформенно) |
||
Функции |
||
Синтаксис: AT&T vs Intel |
} Приветствие миру (GNU/Linux 64) |
|
Целочисленная арифметика |
Адресация операндов |
|
Ограничения архитектуры x86 } |
||
|