Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Invité de passage
    Inscrit en
    janvier 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 11
    Points : 3
    Points
    3

    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 :
    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 316
    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 316
    Points : 12 320
    Points
    12 320

    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
    Invité de passage
    Inscrit en
    janvier 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 11
    Points : 3
    Points
    3

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 316
    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 316
    Points : 12 320
    Points
    12 320

    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
    Invité de passage
    Inscrit en
    janvier 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 11
    Points : 3
    Points
    3

    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.

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
  •