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 :

Code machine et bits de déplacement


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Points : 34
    Points
    34
    Par défaut Code machine et bits de déplacement
    Hello,

    Je m'attaque un peu à la compréhension de la conversion ASM -> Code machine... Et j'ai justement un petit soucis de compréhension sur la manière dont sont représentés les bits de déplacement.

    Dans mon exemple, j'ai une simple fonction on ne peut plus basique correspondant au code C suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int test()
    {
    	int a = 42;
    	return a;
    }
    Ce qui donne ceci une fois compilé par Visual Studio et après visualisation de l'assembleur :

    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
    int test()
    {
    55                   push        ebp  
    8B EC                mov         ebp,esp  
    81 EC CC 00 00 00    sub         esp,0CCh  
    53                   push        ebx  
    56                   push        esi  
    57                   push        edi  
    8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  
    B9 33 00 00 00       mov         ecx,33h  
    B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
    F3 AB                rep stos    dword ptr es:[edi]  
    	int a = 42;
    C7 45 F8 2A 00 00 00 mov         dword ptr [a],2Ah  
    	return a;
    8B 45 F8             mov         eax,dword ptr [a]  
    }
    5F                   pop         edi  
    5E                   pop         esi  
    5B                   pop         ebx  
    8B E5                mov         esp,ebp  
    5D                   pop         ebp  
    C3                   ret
    Ce qui me pose problème, ce sont ces lignes en particulier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C7 45 F8 2A 00 00 00 mov         dword ptr [a],2Ah
    8B 45 F8             mov         eax,dword ptr [a]
    Pas de soucis pour les Opcodes C7h et 8Bh. Dans les deux cas, j'ai le ModR/M à 45h, ce qui me donne [01][000][101], m'indiquant (mauvaise interprétation ?) que les bits de déplacement seront calculés par rapport à la valeur d'EBP.

    Sachant que le contexte d'exécution, une fois "a" assigné, j'ai EBP qui vaut 3'406'824d et ma variable "a" dont l'adresse est 3'406'816d, ça me fait donc une différence entre les deux de 8... Logiquement je m'attends à ce que les bits de déplacement m'indiquent donc 8, mais non, j'ai F8h, et là je ne comprends plus. Quelqu'un saurait-il m'expliquer ?

    Merci à qui prendra le temps de répondre

    [Edit] Après passage sous OllyDbg, ces lignes de code indiquent bien faire référence à [EBP-8], je ne comprends définitivement pas >_<.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Bon ça vient de faire tilt en relisant un peu de la documentation sur le ModR/M. Le déplacement est calculé par addition. Sur la pile, les calculs de déplacement se faisant dans les valeur négatives, la valeur F8h n'est donc pas interprété comme positive, mais comme négative. C'est donc l'encodage de -8...

    Problème résolu, donc ^^'.

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

Discussions similaires

  1. Comment le processeur comprend-il le code machine ?
    Par Invité1 dans le forum Assembleur
    Réponses: 18
    Dernier message: 09/07/2010, 00h36
  2. Pb Debuggage Sources/Code Machine
    Par cjacquel dans le forum Visual C++
    Réponses: 1
    Dernier message: 05/09/2007, 15h50
  3. Réponses: 1
    Dernier message: 19/04/2007, 21h52
  4. Machine 32 bits - cryptage 128 bits
    Par free0pen dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/04/2004, 20h14
  5. Code machine
    Par Willand dans le forum Assembleur
    Réponses: 2
    Dernier message: 20/01/2003, 18h44

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