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 :

Travail sur une chaine de caractères


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Travail sur une chaine de caractères
    Bonsoir à tous.

    Je continue, doucement mais surement, l'apprentissage de l'assembleur. J'ai maintenant bien compris les bases je pense, mais je me heurte ici a un problème de compréhension.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mov eax, [ebp+8]
    movzx eax, byte ptr[eax]
    mov [ebp-0eh], al
    sar dword ptr [ebp-0ch], 3
    nop
    ebp+8 contient une chaîne de caracteres.

    Ce que je comprends :
    1. On recupere la chaine dans eax
    2. On ne conserve que le dernier otet (mais qu'est ce que cela represente ? ma chaine fait 4 octets, normal puisque c'est un pointeur. Mais garder le dernier bit, ça m'etonne :/)
    3. On copie cet octet dans la pile [ebp-0eh]
    4. on divise ebp-0ch par 8

    Bref, quelqu'un comprendrait il l'instruction movzx et son interet?

    Merci d'avance.

    Guillaume.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Bonjour,

    Ligne 1 : On charge dans EAX la valeur (sur 32 bits) qui se trouve à l'adresse pointée EBP + 8 (donc, on remonte dans la pile). Il s'agit en fait de récupérer une variable locale déclarée en dehors de ta fonction, et vraisemblablement dans celle qui a appelé la tienne, ou alors tout simplement passée en argument. Cette valeur est probablement un pointeur vers ta chaîne en mémoire (qui, elle, pour le coup, peut se trouver n'importe où) ;

    Ligne 2 : On charge dans EAX l'octet pointé par… EAX ! On sait que c'est un octet grâce à byte ptr. Donc, par le pointeur que l'on vient de récupérer. On écrase EAX parce qu'on sait que l'on n'aura plus besoin de ce pointeur dans l'immédiat. « MOVZX » signifie « Move with Zero Extend ». Cela signifie que comme on sait que la valeur que l'on pointe est moins large que le registre qui va l'accueillir, on comble le reste avec des zéros ;

    Ligne 3 : On dépose cet octet à l'adresse pointée par [EBP-0eh]. Donc, a priori, une variable locale de ta fonction, cette fois ;

    Ligne 4 : On décale de trois bits vers la droite (donc division par 8) le mot de 32 bits situé en [EBP-0ch] qui correspond à une autre de tes variables locales. Rien à voir, donc, avec celle dans laquelle on vient de déposer notre code.

    Le MOVZX ici ne sert à rien en soi. Par contre, ça peut être utile dans le reste du code que l'on ne voit pas. Il se peut aussi que le compilateur (si c'est un programme désassemblé) ait déterminé que c'était quand même l'instruction la plus efficace compte tenu du contexte.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonjour, merci énormément pour ta réponse. Puis je donc en conclure que l on récupère ainsi le premier caractère de la chaîne ?

    Maintenant dans le cas ou je conserve ma première ligne, et que je place ensuite :
    add eax, 7

    eax pointe sur ebp+15? Aux vues de ce que j ai empilé avant d appeler ma fonction (des pointeurs sur char* ou file*), cela aurait peu de sens.
    À moins que, peut être, eax pointe sur char[7], ce qui reviendrait à sauter les 7 premiers caractères...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par guillaumec38 Voir le message
    Bonjour, merci énormément pour ta réponse. Puis je donc en conclure que l on récupère ainsi le premier caractère de la chaîne ?
    Oui.

    Maintenant dans le cas ou je conserve ma première ligne, et que je place ensuite :

    add eax, 7

    eax pointe sur ebp+15?
    Non. Il y a des crochets, donc un déréférencement. Ta première ligne charge dans EAX ce qui ce trouve à l'adresse pointée par EBP+8. Si ensuite tu ajoutes 7 à EAX, tu augmentes la valeur que tu as chargée.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup !

    Ainsi la premiere ligne recupere mon char* (une adresse donc).
    La deuxieme ligne incremente de 7 et passe donc au 8eme caractere de la chaine

    Probleme resolu donc, merci encore pour ton aide.

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

Discussions similaires

  1. tr et sed sur une chaine de caractére
    Par elflamby dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 13/09/2007, 17h20
  2. Test sur une chaine de caractéres
    Par Je-cherche-pfe dans le forum C#
    Réponses: 3
    Dernier message: 05/09/2007, 00h44
  3. travail sur une chaine
    Par franfr57 dans le forum Débuter avec Java
    Réponses: 20
    Dernier message: 05/12/2006, 17h30
  4. prèlèvements sur une chaine de caractères
    Par Nicobp dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2006, 02h14
  5. Dégradé sur une chaine de caractères avec 3 a 4 couleurs
    Par avogadro dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/03/2006, 14h21

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