Сборка GCC пустой программы на x86, win32
Я пишу пустые программы, чтобы чертовски раздражать кодеров stackoverflow, НЕ. Я просто изучаю набор инструментов GNU.
Теперь следующее может быть слишком глубоким для меня, но чтобы продолжить пустую сагу программы, я начал изучать вывод компилятора C, то, что GNU потребляет.
gcc version 4.4.0 (TDM-1 mingw32)
test.c:
int main()
{
return 0;
}
gcc -S test.c
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl $0, %eax
leave
ret
Можете ли вы объяснить, что здесь происходит? Вот мои усилия, чтобы понять это. Я использовалas
руководство и мои минимальные знания x86 ASM:
.file "test.c"
директива для логического имени файла..def
в соответствии с документами«Начните определять отладочную информацию для имени символа», Что такое символ (имя функции / переменная?) И какая отладочная информация?.scl
: docs говорят«Класс хранения может указывать, является ли символ статическим или внешним», Это то же самоестатический а такжевнешний Я знаю из C? И что это за «2»?.type
: сохраняет параметр«как атрибут типа записи таблицы символов», Я понятия не имею..endef
: без проблем..text
Теперь это проблематично, кажется, что это называется разделом, и я читал, что это место для кода, но документы не сказали мне слишком много..globl
"делает символ видимым для ld.", руководство довольно ясно об этом._main:
Это может быть начальный адрес (?) Для моей основной функцииpushl_
: Длинный (32-битный) пуш, который помещает EBP в стекmovl
: 32-битный ход. Псевдо-C:EBP = ESP;
andl
Логическое И. Псевдо-C:ESP = -16 & ESP
Я не понимаю, в чем смысл этого.call
: Выталкивает IP в стек (чтобы вызываемая процедура могла найти свой путь назад) и продолжает там, где__main
является. (что такое __main?)movl
: этот ноль должен быть константой, которую я возвращаю в конце моего кода. MOV помещает этот ноль в EAX.leave
: восстанавливает стек после инструкции ENTER (?). Почему?ret
: возвращается к адресу инструкции, который сохраняется в стекеСпасибо за помощь!