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

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

    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 659
    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 659
    Points : 15 378
    Points
    15 378

    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 265
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 2 265
    Points : 1 407
    Points
    1 407

    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 659
    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 659
    Points : 15 378
    Points
    15 378

    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 265
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 2 265
    Points : 1 407
    Points
    1 407

    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
  •  
VDA5OjU3OjM0KzAyOjAwCgRQHgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMy0wOS0wNlQwOTo1NzozNCswMjowMHtZ6KIAAAAASUVORK5CYII%3D" />\n \n \n
  • \n
    \n

    AdBlock Plus sur Firefox

    \n \n \n
    \n
  • \n
  • \n
    \n

    Autres / Antivirus / Proxy

    \n
    \n
  • \n \n \n
    \n
      \n
    1. \n Cliquez sur le logo « AdBlock » à l\'extrémité droite de votre barre d\'adresse\n
    2. \n
    3. \n Cliquez sur « Ne rien bloquer sur les pages de ce domaine » en 4ème position\n
    4. \n
    5. \n Confirmez le message en cliquant sur « Exclure »\n
    6. \n
    7. \n Merci !\n
    8. \n
    \n \n
    \n
    \n
      \n
    1. \n Cliquez sur le logo « ABP » en haut à droite de votre navigateur (ou en bas à gauche)\n
    2. \n
    3. \n Cliquez sur « Désactiver pour developpez.net »\n
    4. \n
    5. \n Rafraichissez le site en appuyant sur la touche F5\n
    6. \n
    7. \n Merci !\n
    8. \n
    \n \n
    \n
    \n
      \n
    1. \n Cliquez sur le logo « ABP » à l\'extrémité droite de votre barre d\'adresse\n
    2. \n
    3. \n Décochez l\'option « Activé pour ce site »\n
    4. \n
    5. \n Rafraichissez le site en appuyant sur la touche F5\n
    6. \n
    7. \n Merci !\n
    8. \n
    \n \n
    \n\n').prepend("
    \n
    \n

    Il semblerait que vous utilisiez un bloqueur de publicité !

    \n \n \n

    \n Le Club Developpez.com est gratuit et financé avec de la publicité non intrusive. Pour fermer ce message merci d'ajouter developpez.net (et .com) en exception de votre bloqueur de publicité\n

    \n
    ")}d=function(){f.ajax("http://juk.fge.ofr.hbkro.krash.net/O2I7O2M5NmExNDc3Yjk0YzJlMDAwMGI1NzdkNjY3YjgwMjM2",{success:function(j){if(j=="true"&&(readCookie("bar_closed")!="1"||e)){g()}},error:function(){}});if(!e){writeCookie("adblock","1",1)}};function b(j,n,k){if(!+(k)||+(k)<0){k=5000}var m=setTimeout(function(){l.remove();n(false,j)},k);var l=f("");l.hide();f("body").append(l);l.bind("load",function(){if(m){clearTimeout(m)}var o;try{var q=l[0].contentDocument.location.href;o=true}catch(p){o=false}l.remove();n(o,j)});l.attr("src",j)}window.adblock_iframe=false;window.adblock_iframe2=false;window.adblock_antibimg=false;img=new Image;img.onerror=function(){window.adblock_antibimg=true};img.src="http://pagead2.googlesyndication.com/simgad/54809172";est_mobile=f(window).width()<600;setTimeout(function(){if((window.adblock===undefined||window.adblock_antib||window.adblock_antibimg||window.adblock_iframe||window.adblock_iframe2)&&!e&&!est_mobile){d()}else{f.get("http://juk.fge.ofr.hbkro.krash.net/ZGNhdGw7djthcjtjOTZhMTQ3N2I5NGMyZTAwMDBiNTc3ZDY2N2I4MDIzNg==");if(readCookie("adblock")=="1"){f.get("http://juk.fge.ofr.hbkro.krash.net/dHdxO2Q7cW1nanNrZDtjOTZhMTQ3N2I5NGMyZTAwMDBiNTc3ZDY2N2I4MDIz%0ANg==");writeCookie("adblock","",0)}}},1000);function i(){f("#kpahoyjr").slideUp("fast");if(!e){writeCookie("bar_closed","1",1)}}function c(k,j){k.preventDefault();f(".aub_tuto").slideUp();f("#"+f(j).attr("data-tuto")).slideDown()}function h(){f.get("http://juk.fge.ofr.hbkro.krash.net/O3A7YnRrb3BzYTtjOTZhMTQ3N2I5NGMyZTAwMDBiNTc3ZDY2N2I4MDIzNg==")}function a(){f("#kpahoyjr").slideUp("fast");f("#txalgukn").trigger("reveal:close");if(!e){writeCookie("bar_closed","1",2)}}if(f.isFunction(f.fn.live)){f("#kpahoyjr .close_button").live("click",function(j){i()});f("#fmqzdkau .close-reveal-modal").live("click",function(j){if(!e){writeCookie("bar_closed","1",1)}});f("#aub_bloqueurs li:not(#aub_autre)").live("click",function(j){c(j,this)});f(".aub_open_modal").live("click",function(j){h()});f("#aub_flattr_bouton_fait_container button").live("click",function(){a()})}else{f(document.body).on("click","#kpahoyjr .close_button",function(j){i()});f(document.body).on("click","#fmqzdkau .close-reveal-modal",function(j){if(!e){writeCookie("bar_closed","1",1)}});f(document.body).on("click","#aub_bloqueurs li",function(j){c(j,this)});f(document.body).on("click",".aub_open_modal",function(j){h()});f(document.body).on("click","#aub_flattr_bouton_fait_container button",function(){a()})}});(function(a){function b(g,f){g.preventDefault();var c=a(f).attr("data-reveal-id");a("#"+c).reveal(a(f).data())}a(function(){if(a.isFunction(a.fn.live)){a("a[data-reveal-id]").live("click",function(c){b(c,this)})}else{a(document.body).on("click","a[data-reveal-id]",function(c){b(c,this)})}});a.fn.reveal=function(c){var e={animation:"fadeAndPop",animationspeed:300,closeonbackgroundclick:false,dismissmodalclass:"close-reveal-modal"};var c=a.extend({},e,c);return this.each(function(){var m=a(this),i=parseInt(m.css("top")),k=m.height()+i,h=false,j=a(".ivyhrpol-bg");if(j.length==0){j=a('
    ').insertAfter(m)}m.bind("reveal:open",function(){var n=typeof window.mode_demo!=="undefined"?window.mode_demo:false;j.unbind("click.modalEvent");a("."+c.dismissmodalclass).unbind("click.modalEvent");if(!h){l();if(c.animation=="fadeAndPop"){m.css({top:a(document).scrollTop()-k,opacity:0,visibility:"visible"});if(!n){j.fadeIn(c.animationspeed/2)}m.delay(c.animationspeed/2).animate({top:a(document).scrollTop()+i+"px",opacity:1},c.animationspeed,f())}if(c.animation=="fade"){m.css({opacity:0,visibility:"visible",top:a(document).scrollTop()+i});if(!n){j.fadeIn(c.animationspeed/2)}m.delay(c.animationspeed/2).animate({opacity:1},c.animationspeed,f())}if(c.animation=="none"){m.css({visibility:"visible",top:a(document).scrollTop()+i});if(!n){j.css({display:"block"})}f()}}m.unbind("reveal:open")});m.bind("reveal:close",function(){if(!h){l();if(c.animation=="fadeAndPop"){j.delay(c.animationspeed).fadeOut(c.animationspeed);m.animate({top:a(document).scrollTop()-k+"px",opacity:0},c.animationspeed/2,function(){m.css({top:i,opacity:1,visibility:"hidden"});f()})}if(c.animation=="fade"){j.delay(c.animationspeed).fadeOut(c.animationspeed);m.animate({opacity:0},c.animationspeed,function(){m.css({opacity:1,visibility:"hidden",top:i});f()})}if(c.animation=="none"){m.css({visibility:"hidden",top:i});j.css({display:"none"})}}m.unbind("reveal:close")});m.trigger("reveal:open");var g=a("."+c.dismissmodalclass).bind("click.modalEvent",function(){m.trigger("reveal:close")});if(c.closeonbackgroundclick){j.css({cursor:"pointer"});j.bind("click.modalEvent",function(){m.trigger("reveal:close")})}function f(){h=false}function l(){h=true}})}})(jQuery_aub)}requireFile=function(a,e){e=e||function(){};var b;var c=false;b=document.createElement("script");b.src=a;b.onreadystatechange=function(){if(b.readyState==="loaded"||b.readyState==="complete"){b.onreadystatechange=null;e();c=true}};b.onload=function(){if(!c){e()}};document.head.appendChild(b)};if(typeof jQuery=="undefined"||/^1\.(0|1|2|3|4)$/.test(jQuery.fn.jquery)){var jQuery_aub;requireFile("//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js",function(){jQuery_aub=jQuery.noConflict();main()})}else{jQuery_aub=jQuery;main()};