Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 32-bits / 64-bits
x86 32-bits / 64-bits Architectures x86 32/64 bits et leurs outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/10/2012, 11h29   #1
rambc
Membre Expert
 
Inscription : décembre 2006
Messages : 2 197
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 2 197
Points : 1 221
Points : 1 221
Par défaut Assembleur et gcc

Bonjour.

Considérons le code C suivant contenu dans un fichier "main.cpp" .

Code C :
1
2
3
4
5
int main(){
int a = 5;
a = a + 2;
return 0;
}

Sous Linux Ubutnu, la commande "gcc -S main.cpp" renvoie le code assembleur suivant.

Code Assembleur :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    .file    "main.c"
    .text
.globl main
    .type    main, @function
main:
.LFB0:
    .cfi_startproc
    pushq    %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movl    $3, -4(%rbp)
    addl    $2, -4(%rbp)
    movl    $0, %eax
    leave
    ret
    .cfi_endproc
.LFE0:
    .size    main, .-main
    .ident    "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

Dans le code précédent, ce qui m'intéresse ce sont les lignes suivantes.

Code Assembleur :
1
2
3
4
5
6
7
8
9
    pushq    %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movl    $3, -4(%rbp)
    addl    $2, -4(%rbp)
    movl    $0, %eax
    leave

Quelqu'un pourrait-il m'expliquer un peu ces lignes ? Existe-t-il une documentation expliquant les mots clés ?
rambc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2012, 15h45   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Chercheur d'emploi
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
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 :

Code :
1
2
    pushq    %rbp
    movq    %rsp, %rbp
… 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 :
1
2
3
4
    movl    $3, -4(%rbp)
    addl    $2, -4(%rbp)
    movl    $0, %eax
    leave
Chez moi, j'obtiens « $5 » à la première ligne et c'est censé être pareil chez toi.

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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2012, 18h58   #3
rambc
Membre Expert
 
Inscription : décembre 2006
Messages : 2 197
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 2 197
Points : 1 221
Points : 1 221
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...
rambc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2012, 19h30   #4
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 610
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Chercheur d'emploi
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2007
Messages : 4 610
Points : 11 065
Points : 11 065
Citation:
Envoyé par rambc Voir le message
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...
En effet, c'est ce que je disais juste au-dessus :
Citation:
Envoyé par Obsidian Voir le message
Chez moi, j'obtiens « $5 » à la première ligne et c'est censé être pareil chez toi.
Essaie de recompiler pour voir si tu obtiens toujours le même résultat ou pas.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2012, 19h35   #5
rambc
Membre Expert
 
Inscription : décembre 2006
Messages : 2 197
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 2 197
Points : 1 221
Points : 1 221
Je confirme, j'ai mal recopié les codes...

Merci pour toutes ces infos.
rambc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h00.


 
 
 
 
Partenaires

Hébergement Web