J'écris vide programmes d'importuner l'enfer hors de stackoverflow codeurs, PAS. Je suis tout simplement découvrir la chaîne d'outils gnu.
Maintenant ce qui suit est peut-être trop profond pour moi, mais pour continuie le programme vide de la saga que j'ai commencé à examiner la sortie du compilateur C, les trucs GNU, comme en consomme.
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
Pouvez-vous expliquer ce qui se passe ici? Voici mon effort pour le comprendre. J'ai utilisé l' as
manuel et mon minimale ASM x86 connaissances:
-
.file "test.c"
est la directive pour le nom de fichier logique. -
.def
: selon les docs "Commencer à définir les informations de débogage pour un nom de symbole". Qu'est ce qu'un symbole (un nom de fonction ou variable?) et quel type d'informations de débogage? -
.scl
: docs disent "classe de Stockage peut signaler si un symbole est statique ou externe". Est-ce le même statique et externe je sais par C? Et qu'est ce que '2'? -
.type
: stocke le paramètre "comme l'attribut type de symbole d'entrée de la table", je n'ai aucune idée. -
.endef
: pas de problème. -
.text
: C'est problématique, il semble être quelque chose qui s'appelle l'article et j'ai lu que c'est la place pour le code, mais les docs ne me dites pas trop. -
.globl
"fait le symbole visible de ld.", le manuel est assez clair sur ce point. -
_main:
Cela peut être l'adresse de départ (?) pour ma fonction principale -
pushl_
: Long (32 bits) pousser, ce qui le place EBP sur la pile -
movl
: 32 bits déplacer. Pseudo-C:EBP = ESP;
-
andl
: Logique ET. Pseudo-C:ESP = -16 & ESP
, je ne vois vraiment pas quel est le point de cet. -
call
: Pousse l'IP de la pile (donc la procédure d'appel peut trouver son chemin de retour) et se poursuit là où__main
. (qu'est-ce que __principal?) -
movl
: c'zéro doit être la constante I retour à la fin de mon code. Le MOV lieux de ce à zéro dans EAX. -
leave
: restaure la pile après l'ENTRÉE de l'enseignement (?). Pourquoi? -
ret
: remonte à l'adresse d'instruction qui est sauvegardé sur la pile
Merci pour votre aide!