|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre Expert
![]() ![]() Inscription : décembre 2006 Messages : 2 197 ![]() |
Bonjour.
Considérons le code C suivant contenu dans un fichier "main.cpp" . Code C :
Sous Linux Ubutnu, la commande "gcc -S main.cpp" renvoie le code assembleur suivant. Code Assembleur :
Dans le code précédent, ce qui m'intéresse ce sont les lignes suivantes. Code Assembleur :
Quelqu'un pourrait-il m'expliquer un peu ces lignes ? Existe-t-il une documentation expliquant les mots clés ? |
||||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Bonjour,
Les lignes commençant par « .cfi » et d'une manière générale par « . » sont des directives à l'intention du compilateur. Elles ne font pas partie du programme proprement dit. Ensuite, le code généré est de l'assembleur Intel mais en utilisant la syntaxe AT&T, avec des « % » et avec l'opérande source à gauche, la destination à droite. Dans les lignes suivantes : … on sauvegarde le registre BP (Base Pointer, appelé EBP sur i386 quand il a été étendu à 32 bits, puis RBP sur x86_64) dans la pile, puis on sauvegarde le pointeur de pile dans ce même registre, auquel on ne touchera plus. C'est le prologue classique d'une fonction : on sauvegarde le pointeur de pile pour pouvoir exploiter celle-ci comme on veut, notamment pour y stocker les variables locales. Ça nous permet si nécessaire de ramener d'un coup le pointeur de pile à son état initial et, de là, restaurer les registres et sortir de la fonction. Ensuite : Code :
Cette première ligne stocke la valeur initiale dans ta variable locale « a », qui est repérée en mémoire via un offset par rapport au pointeur de base (donc le pied du cadre de pile). La ligne suivante ajoute « 2 » à la même variable. Traditionnellement, on utilise l'accumulateur AX (donc EAX ou RAX selon le format) pour renvoyer la valeur de retour de la fonction, soit toujours zéro chez toi. Enfin, « LEAVE » est une instruction Intel x86 qui permet, en un seul code opération, de nettoyer le cadre de pile, de restaurer les bons registres et d'effectuer un « RET » pour revenir à la fonction appelante. |
||
|
|
10
|
|
|
#3 |
|
Membre Expert
![]() ![]() Inscription : décembre 2006 Messages : 2 197 ![]() |
Merci pour ces éclaircissements.
![]() Un truc me chagrine. Pourquoi stocke-t-on 5 avec la ligne suivante ? Je pose cette question car j'aurais penser voir $5 au lieu de $3... J'ai dû faire une faute de frappe quelque part... |
|
|
00
|
|
|
#4 | |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 610 ![]() |
Citation:
Essaie de recompiler pour voir si tu obtiens toujours le même résultat ou pas. |
|
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Inscription : décembre 2006 Messages : 2 197 ![]() |
Je confirme, j'ai mal recopié les codes...
Merci pour toutes ces infos. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com