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

Assembleur Discussion :

Instructions ROL et ROR


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Instructions ROL et ROR
    Bonjour,

    Je voudrais avoir des précisions sur les fonctions ROL et ROR.

    par exemple avec
    EAX=A0F060A0
    et après
    ROL EAX,0D
    pourquoi EAX=0C14141E
    ?

    de même,avec
    EBX=30E0F0D1
    et après
    ROR EBX,0D
    pourquoi EBX=86898707
    ?

    Merci pour vos réponses !

    Bigbang

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 24
    Points : 28
    Points
    28
    Par défaut
    c'est simple, c'est le même chose que pour shl et shr sauf que les bits qui sont expulsés sont remis de l'autre coté. c'est un peu comme une rotation de bits.

    exemple :

    al = 11000011

    si on effectue un rol al, 2
    alors al = 00001111

    si on effectue un ror al, 2
    alors al = 11110000

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    ok ok ...

    merci !

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    je vois bien comment ca marche ...

    mais si j'ai une équation de ce style (où l'on cherche x) :

    ROL(x,0D)=102E2E2E

    comment peut trouver x ?

    De même si j'ai

    ROR(y,0D)=0B018B0E

    Comme trouver y ?

    Merci à vos réponses !

    Bigbang

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 24
    Points : 28
    Points
    28
    Par défaut
    ben faut tout simplement faire l'opération inverse :

    si ROL(x,0D)=102E2E2E
    alors x=ROR(102E2E2E,0D)

    et si ROR(y,0D)=0B018B0E
    alors y=ROL(0B018B0E,0D)

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    oui c'est bien ce que j'ai fais, mais lorsque je le fais et que je compare avec la valeur donnée par le débugger, elles sont différentes...

    si ROL(x,0D)=102E2E2E alors x=ROR(102E2E2E,0D)

    alors je convertit 102E2E2E en binaire :

    102E2E2E <-> 10000001011100010111000101110

    et donc après j'effectue la rotation à droite (je pense que c'est ici qu'il y a un problème) :

    Je prends le chiffre de droite et je le mets a gauche. Et je recommence cette opération 13 fois (0D fois). Voici le détail des opérations, les 13:

    10000001011100010111000101110 ; nombre initial
    01000000101110001011100010111 ; déplacement 1
    10100000010111000101110001011 ; déplacement 2
    11010000001011100010111000101 ; déplacement 3
    11101000000101110001011100010 ; déplacement 4
    01110100000010111000101110001 ; déplacement 5
    10111010000001011100010111000 ; déplacement 6
    01011101000000101110001011100 ; déplacement 7
    00101110100000010111000101110 ; déplacement 8
    00010111010000001011100010111 ; déplacement 9
    10001011101000000101110001011 ; déplacement 10
    11000101110100000010111000101 ; déplacement 11
    11100010111010000001011100010 ; déplacement 12
    01110001011101000000101110001 ; déplacement 13


    donc j'obtiens ce nombre : 01110001011101000000101110001
    que je convertis en hexadécimal, ce qui donne : E2E8171

    Le problème est que lorsque je mets cette valeur (E2E8171) dans EAX juste avant l'execution de
    ROL EAX,0D
    et que j'execute ensuite cette commande, elle modifie EAX par cette nouvelle valeur : D02E21C5

    or D02E21C5 et 102E2E2E ne sont pas égaux..

    Où réside le problème ?

    Bigbang

  7. #7
    LFC
    LFC est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 106
    Points : 70
    Points
    70
    Par défaut
    Allez, je me lance...

    Le ROL/ROR place son bit du coté dans la carry ou pas ?
    Parce que s'il y a qqchose dans la carry avant et qu'elle circule, ça casse tout ton résultat...

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    c'est quoi la carry ? elle sert à quoi ? elle fait quelle taille ?

    pourriez-vous reprendre le raisonnement avec mon exemple ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2002
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 24
    Points : 28
    Points
    28
    Par défaut
    102E2E2E <-> 10000001011100010111000101110
    ça c'est bon pour la calculatrice windows seulement.

    n'oublies pas que le proc il lui faut 32 bits, et dans ta conversion y en a que 29.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    le carry c'est le bit 0 du FLAGS c'est un indicateur de retenu mais elle sert surtout par exemple dans un cas ou il y a une erreur

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Points : 121
    Points
    121
    Par défaut
    Non non, je pense que c'est Executter qui a raison. A mon avis, le carry n'a rien à voir dans tout ca...
    Il faut par contre impérativement prendre en compte le fait que windows travaille en 32 bits et les "0" sont très importants, même s'il sont positionnées en premier dans ton nombre binaire, car après avoir appelé les instructions ROL et ROR, ils se retrouveront à la fin du nombre et deviendront essenciels!!!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Points : 121
    Points
    121
    Par défaut
    Imagine par exemple que ton processeur travaille avec des nombres décimaux codés sur 4 chiffres (ce qui est bien sur complètement faux!)

    Tu prends : 145 , qui sera codé 0145

    Il va ensuite devenir 1450 après l'appel de ROL

    Alors que toi, tu aurais obtenu 514 car tu n'aurais pas pris en compte la présence du "0" devant le nombre "145"

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    ok ...

    c'est bon j'ai réussi à résoudre mon problème .. avec l'aide d'un petit programme en C, en faisant appel aux fonctions rotl et rotr

    A++

    Bigbang

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    (La fonction première du carry flag est de dire si il y a retenue dans une opération ou non)

Discussions similaires

  1. Instruction ARPL
    Par le mage tophinus dans le forum Assembleur
    Réponses: 14
    Dernier message: 10/03/2003, 10h15
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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