Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre Expert

    Inscrit en
    décembre 2006
    Messages
    2 256
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 2 256
    Points : 1 291
    Points
    1 291

    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 ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 377
    Points : 12 642
    Points
    12 642

    Par défaut

    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.

  3. #3
    Membre Expert

    Inscrit en
    décembre 2006
    Messages
    2 256
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 2 256
    Points : 1 291
    Points
    1 291

    Par défaut

    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...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 377
    Points : 12 642
    Points
    12 642

    Par défaut

    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.

  5. #5
    Membre Expert

    Inscrit en
    décembre 2006
    Messages
    2 256
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 2 256
    Points : 1 291
    Points
    1 291

    Par défaut

    Je confirme, j'ai mal recopié les codes...

    Merci pour toutes ces infos.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •