IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

différence entre un code 64 et 32 bits


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Points : 120
    Points
    120
    Par défaut différence entre un code 64 et 32 bits
    Bonjour

    j'ai ce code en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
    int main ()
    {
            printf ("hello %d", 7);
            return 0;
    }
    j'ai utilisé CC pour générer le code assembleur pour 32 et 64 bits
    pour 32bits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
            .file   "a.c"
            .section        .rodata
    .LC0:
            .string "hello %d"
            .text
            .globl  main
            .type   main, @function
    main:
    .LFB0:
            .cfi_startproc
            pushl   %ebp
            .cfi_def_cfa_offset 8
            .cfi_offset 5, -8
            movl    %esp, %ebp
            .cfi_def_cfa_register 5
            andl    $-16, %esp
            subl    $16, %esp
            movl    $7, 4(%esp)
            movl    $.LC0, (%esp)
            call    printf
            movl    $0, %eax
            leave
            .cfi_restore 5
            .cfi_def_cfa 4, 4
            ret
            .cfi_endproc
    .LFE0:
            .size   main, .-main
            .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
            .section        .note.GNU-stack,"",@progbits
    pour 64 bits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
            .file   "a.c"
            .section        .rodata
    .LC0:
            .string "hello %d"
            .text
            .globl  main
            .type   main, @function
    main:
    .LFB0:
            .cfi_startproc
            pushq   %rbp
            .cfi_def_cfa_offset 16
            .cfi_offset 6, -16
            movq    %rsp, %rbp
            .cfi_def_cfa_register 6
            movl    $7, %esi
            movl    $.LC0, %edi
            movl    $0, %eax
            call    printf
            movl    $0, %eax
            popq    %rbp
            .cfi_def_cfa 7, 8
            ret
            .cfi_endproc
    .LFE0:
            .size   main, .-main
            .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
            .section        .note.GNU-stack,"",@progbits
    Je ne comprends pas le version 64. est-ce qu'il n'a pas utilisé le pile ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Bonjour,

    Le fait que le second code n'utilise pas la pile pour passer ses arguments n'est pas dû — en soi — au 64 bits.

    Dans un premier temps, certaines options d'optimisations ont dû être passées au compilateur dans un cas et pas dans l'autre. Ensuite, le fait d'exploiter au maximum les registres à sa disposition avant de creuser la pile est une option d'optimisation qu'il est possible de demander à la compilation.

    Lorsque cela reste au sein de ton propre programme, cela ne pose pas de problème. Par contre, si tu fais appel à une bibliothèque extérieure, il faut que celle-ci soit prête à les recevoir, c'est-à-dire compilée avec les mêmes options.

    Visiblement, la version 32 bits de la bibliothèque standard installée sur ta machine a été construite de manière traditionnelle et la version 64 bits de façon optimisée.

  3. #3
    Membre régulier

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Points : 120
    Points
    120
    Par défaut A
    merci pour ta réponse
    sur le 32, lorsque je veux appeler une fonction comme write le premier paramètre doit être dans EAX, le deuxième dans EBX, en suite ECX ...
    est-ce qu'on garde le même principe sur 64 avec RAX, RBX, RCX ...

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    bonjour,

    ce sont simplement des conventions d'appel différentes
    si je ne dis pas de bêtise dans tes exemples celui en 32bits ce doit être du CDECL et en 64bits l'ABI System V AMD64 (pdf)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Je viens d'apprendre un nouveau truc.

    User-level applications use as integer registers for passing the sequence %rdi, %rsi, %rdx, %rcx, %r8 and %r9. The kernel interface uses %rdi, %rsi, %rdx, %r10, %r8 and %r9.
    source:
    http://stackoverflow.com/questions/2...alls-on-x86-64

    J'ignorais totalement que la convention était différente en mode user..
    Ca explique le problème que j'ai eu avec "getaddrinfo" pour accéder à r10 qui en faite était rcx..
    J'avais conclu à un bug. J'ai eu un problème différent sur chaque os pour cette fonction donc ça ne m'avait pas trop étonné sur le coup et j'étais passé par la pile pour accéder au 4ème argument.

    Je viens de tester avec rcx et ça fonctionne parfaitement.

    a+

Discussions similaires

  1. Différences entre Home 32bits et Pro 64 bits
    Par Yepazix dans le forum Windows 7
    Réponses: 10
    Dernier message: 21/02/2010, 12h47
  2. La différence entre windows 7 64 et 32 bits
    Par scaryfan dans le forum Windows 7
    Réponses: 8
    Dernier message: 23/10/2009, 15h44
  3. Réponses: 3
    Dernier message: 11/07/2009, 01h34
  4. Différence entre deux code
    Par anisprog_2008 dans le forum VB.NET
    Réponses: 0
    Dernier message: 28/10/2008, 12h42
  5. Différence entre deux codes?
    Par benoit13 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/07/2008, 08h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo