Я пишу пустые программы, чтобы раздражать ад из кодеков stackoverflow, NOT. Я просто изучаю gnu toolchain.
Теперь для меня может быть слишком глубоко, но для продолжения пустой саги программы я начал изучать вывод компилятора 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
и мои минимальные знания ASM x86:
-
.file "test.c"
- это директива для логического имени файла. -
.def
: согласно документам "Начать определение информации отладки для имени символа". Что такое символ (имя/переменная функции?) И какая отладочная информация? -
.scl
: docs говорят: "Класс хранения может указывать, является ли символ статическим или внешним". Является ли это тем же статическим и внешним, что я знаю из C? И что это за "2"? -
.type
: сохраняет параметр "как атрибут типа записи в таблице символов", я понятия не имею. -
.endef
: нет проблем. -
.text
: Теперь это проблематично, кажется, что-то называется секцией, и я прочитал, что это место для кода, но документы не слишком мне говорили. -
.globl
"делает символ видимым для ld.", руководство здесь совершенно ясно. -
_main:
Это может быть начальный адрес (?) для моей основной функции -
pushl_
: длинный (32-битный) push, который помещает EBP в стек -
movl
: 32-битное перемещение. Псевдо-C:EBP = ESP;
-
andl
: Логическое И. Pseudo-C:ESP = -16 & ESP
, я действительно не понимаю, в чем смысл этого. -
call
: помещает IP в стек (так называемая процедура может вернуться назад) и продолжается там, где__main
. (что такое __main?) -
movl
: этот нуль должен быть константой, которую я возвращаю в конце моего кода. MOV помещает этот ноль в EAX. -
leave
: восстанавливает стек после команды ENTER (?). Почему? -
ret
: возвращается к адресу инструкции, который сохраняется в стеке
Благодарим за помощь!