.file "test.c"
Команды, начинающиеся с. директивы ассемблеру. Это просто говорит, что это «file.c», эта информация может быть экспортирована в отладочную информацию exe.
.def ___main; .scl 2;
.type 32; .endef
Директивы
.def определяют символ отладки. scl 2 означает класс хранения 2 (класс внешнего хранения). type 32 говорит, что этот символ является функцией. Эти числа будут определены в формате pe-coff exe
___ main - это вызываемая функция, которая заботится о начальной загрузке, необходимой gcc (она будет выполнять такие вещи, как запуск статических инициализаторов c ++ и другие необходимые служебные действия).
.text
Начинается текстовый раздел - код живет здесь.
.globl _main
определяет символ _main как глобальный, что делает его видимым для компоновщика и других модулей, с которыми он связан.
.def _main; .scl 2; .type 32; .endef
То же самое, что и _main, создает отладочные символы, указывающие, что _main является функцией. Это может быть использовано отладчиками.
_main:
Запускает новый ярлык (в итоге получится адрес). директива .globl выше делает этот адрес видимым для других объектов.
pushl %ebp
Сохраняет старый указатель кадра (регистр ebp) в стеке (чтобы его можно было вернуть на место после завершения этой функции)
movl %esp, %ebp
Перемещает указатель стека в регистр ebp. ebp часто называют указателем кадра, он указывает на верхнюю часть значений стека в текущем «кадре» (обычно это функция) (обращение к переменным в стеке через ebp может помочь отладчикам)
andl $ -16,% esp
Заканчивает стек с помощью fffffff0, который эффективно выравнивает его по 16-байтовой границе. Доступ к выровненным значениям в стеке намного быстрее, чем если бы они были выровнены. Все эти предыдущие инструкции в значительной степени являются стандартным прологом функции.
call ___main
Вызывает функцию ___main, которая будет выполнять инициализацию вещей, необходимых gcc. Call вызовет указатель текущей инструкции в стеке и перейдет к адресу ___ main
movl $0, %eax
переместить 0 в регистр eax (0 в ответ 0;) регистр eax используется для хранения значений, возвращаемых функцией для соглашения о вызовах stdcall.
отпуск
Инструкция по отпуску довольно краткая для
movl ebp,esp
popl ebp
т.е. он «отменяет» работу, выполняемую в начале функции, - восстанавливая указатель кадра и укладывая его в прежнее состояние.
1073 * RET *
Возвращается тому, кто вызвал эту функцию. Он извлечет указатель инструкций из стека (который будет помещена туда соответствующей инструкцией вызова) и перейдет туда.