J'écris des programmes vides pour contrarier les codeurs stackoverflow, NON. Je suis juste en train d'explorer la chaîne d'outils GNU. Maintenant, ce qui suit peut être trop profond pour moi, mais pour continuer la saga de programme vide, j'ai commencé à examiner la sortie du compilateur C, le truc que consomme GNU.L'assemblage de GCC d'un programme vide sur x86, win32
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. Je l'ai utilisé le manuel as
et ma connaissance minimale ASM x86:
.file "test.c"
est la directive pour le nom de fichier logique..def
: selon les documents "Commencer à définir les informations de débogage pour un nom de symbole". Qu'est-ce qu'un symbole (un nom/une variable de fonction?) Et quel type d'information de débogage?.scl
: les documents indiquent "La classe de stockage peut indiquer si un symbole est statique ou externe". Est-ce le même statique et externe Je sais de C? Et quel est ce '2'?.type
: stocke le paramètre "en tant qu'attribut de type d'une entrée de table de symboles", je n'ai aucune idée..endef
: pas de problème..text
: Maintenant, cela est problématique, il semble que ce soit quelque chose appelé section et j'ai lu que c'est l'endroit pour le code, mais les docs ne m'en disaient pas trop..globl
"rend le symbole visible à ld.", le manuel est assez clair à ce sujet._main:
Cela pourrait être l'adresse de départ pour ma fonction principalepushl_
(?): Un appui long (32 bits), qui place RASE sur la pilemovl
: déplacer 32bit. Pseudo-C:EBP = ESP;
andl
: AND logique. Pseudo-C:ESP = -16 & ESP
, je ne vois vraiment pas quel est le but de ceci.call
: Pousse l'adresse IP à la pile (afin que la procédure appelée puisse retrouver son chemin) et continue où__main
est. (qu'est-ce que __main?)movl
: ce zéro doit être la constante que je retourne à la fin de mon code. Le MOV place ce zéro dans EAX.leave
: restaure la pile après une instruction ENTRÉE (?). Pourquoi?ret
: remonte à l'adresse d'instruction qui est enregistré sur la pile
Merci pour votre aide!
Bonne question. :) –
Cela ressemble à un excellent exercice pour un vrai geek. – JesperE
J'ai trouvé la spécification COFF. Cela devrait donner quelques références à ce que "32" dans ".type" signifie etc: http://www.microsoft.com/whdc/system/platform/firmware/PECOFFdwn.mspx –