Сборка 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: возвращается к адресу инструкции, который сохраняется в стеке

Спасибо за помощь!

Ответы на вопрос(5)

Ваш ответ на вопрос