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 :

Déclaration et utilisation de variables locales en pile


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut Déclaration et utilisation de variables locales en pile
    Bonjour à tous,
    j'ai des petits soucis concernant un programme. J'ai une fonction en C qui ressemble à peu près à ça:
    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
    static Image *ReadXBMImage(const ImageInfo *image_info,ExceptionInfo *exception)
    {
      char
        buffer[MaxTextExtent], //avec #define MaxTextExtent 4096
        name[MaxTextExtent];
     
      Image
        *image;
      long
        y;
     
      register long
        i,
        x;
     //plein d'autres déclarations de variables
      assert(image_info != (const ImageInfo *) NULL);
      assert(image_info->signature == MagickSignature);
     
    //plein dautre code, pas vraiment necessaire à la compréhension du shmilblick
    En toute logique, buffer devrait être à la base de la pile (car déclaré en premier) et on aurrait le shéma suivant:

    [name: 4086 bytes][buffer: 4086 bytes][EBP][EIP]

    Le problème est qu'en faisant un disass sur le code compilé, j'ai un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov eax, ebp-1014h  ;avec eax qui est l'adresse de notre buffer
    Si on sais utiliser une calculatrice, on se rend bien compte que 4086 = 0X1000.
    On a alors le shéma de pile suivant:
    [buffer: 4096 octets][zone inconnue: 20 octets]

    J'aurrais donc voulu savoir pourquoi mon buffer n'est pas à la bonne place. Est-ce que c'est le compilo (gcc) qui fait des siennes et gère les variables comm il le veut? est-ce qu'il réserve cet espace pour y stocker des données utilisées pour l'exécution ou autre (comem assert)?

    Je susi un peu perdu, si quelqu'un pouvait m'aider là dessus, je lui en serait bien reconnaissant

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut
    Je ne connais pas GCC mais savez-vous s'il se passe la même chose en "debug" et en "release" ?
    Avez-vous comparé avec une autre fonction ?
    Mon idée est que ces 20 octets sont le résultat de divers "push"

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 105
    Points : 61
    Points
    61
    Par défaut
    merci pour la réponse j'avais completement oublié les push intermédiaires
    Enfin toujours est-il que seulement 3 push sont effectués (edi,esi,ebx) avant le sub esp soit 3*4 = 12 octets. me restent encore 8octets sur les bras je ne vois pas d'ou ça provient.
    Un collègue a le même souci. Sur un code de fonction suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type mafonction(...){
          char buffer[MAX];
          //autres variables
          int compteur
    }
    et dans la pile il se trouve que la variable compteur se situe avant le buffer (adresses plus hautes) donc entre celui-ci et ebp.
    Après le fait d'être en debug plutot qu'en release peut-il changer la constitution de la pile? je vais me essayer de me renseigner un peu dessus.

Discussions similaires

  1. Utiliser la valeur d'un spinner lors de la déclaration d'une variable locale
    Par Jiggazzzzz dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 05/12/2011, 09h31
  2. Déclaration et utilisation de variable globale
    Par snoopy69 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 08h35
  3. Réponses: 3
    Dernier message: 09/12/2008, 16h48
  4. Réponses: 0
    Dernier message: 02/09/2008, 12h14
  5. [NASM][Pile] Sauvegarder variable locale dans variable passée en paramètre
    Par homeostasie dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 20/01/2007, 09h48

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