Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
23.11.2024
Размер:
462.9 Кб
Скачать

МИЭТ, СПИНТех, КАИ

Введение в 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 }

 

Соседние файлы в папке АВС