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 :

algorithme de l'opcode CMP


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    900
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 900
    Points : 85
    Points
    85
    Par défaut algorithme de l'opcode CMP
    Bonjour,

    L'instruction CMP d'intel compare deux valeurs , ok ;
    elle retourne son resultat dans le registre EFLAG.

    j'aurais besoin de connaitre son algorithme , ou je pourrai le trouver ???

    Merci.

  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
    Bonsoir,

    Il faut savoir avant tout que lors des comparaisons et des sauts conditionnels, le micro-processeur effectue des opérations qui, dans tous les cas, mettraient à jour les flags. En fait, ces flags sont indépendants de l'opération effectuée, mais prennent automatiquement une valeur sur une condition donnée. C'est le cas de Z, par exemple, qui est l'indicateur de zéro, et qui passe donc à un si le résultat de la dernière opération effectuée, quelle qu'elle soit, est nul. Avec un bémol cependant : en fonction des opérations à mener, le micro-processeur peut décider d'inhiber la mise à jour des flags, mais pas de modifier leur comportement.

    Ensuite, sur pratiquement tous les micro-processeurs, l'instruction de comparaison CMP procède en fait à une soustraction de l'opérande, mais sans mettre à jour l'accumulateur-cible.

    Si le résultat est nul, les opérandes sont égales. C'est pour cela que les instructions conditionnelles de saut JE (Jump If Equal) et JZ (Jump if Zero) sont en fait les mêmes et partagent le même code opération.

    Les flags de dépassement et autres permettent d'obtenir plus d'informations sur les opérandes initiales. S'il y a eu dépassement, c'est que le soustracteur était plus grand que l'opérande, d'où JG ou JGE.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    900
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 900
    Points : 85
    Points
    85
    Par défaut
    J'essaye de faire exactement pareille que l'instruction CMP mais en programmation.

    Je joint un projet et les resultats sont différents donc c'est pas bon et je ne sais pas comment faire.

    Pour info : j'ai pris un extrait de code de l'émulateur Bochs.
    Fichiers attachés Fichiers attachés

  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
    Relis bien mon commentaire ! L'instruction CMP est une soustraction. Rien d'autre. La seule différence est que le résultat n'est pas stocké dans le registre de départ.

    Les différents flags ne sont pas liés en soi à l'instruction CMP ou à une autre. Ils se mettent à jour automatiquement avec chaque nouveau résultat arithmétique. Par exemple, « Z » se met à un chaque fois que le résultat de la dernière opération est nul. Donc, dans le cas d'une soustraction en particulier, un résultat nul indique que les deux opérandes sont égales.

    Les instructions de saut conditionnel, elles, ne s'appuient que sur l'état de ces flags et sont encore moins liées avec les opérations précédentes. « JZ » et « JE », par exemple, sauteront vers l'adresse de destination si et seulement si « Z » est à un, peu importe que ce flag soit passé à cette valeur du fait de la dernière opération arithmétique ou que tu l'aies artificiellement forcé en modifiant EFLAGS à la main.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    900
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 900
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Relis bien mon commentaire ! L'instruction CMP est une soustraction. Rien d'autre. La seule différence est que le résultat n'est pas stocké dans le registre de départ.

    Les différents flags ne sont pas liés en soi à l'instruction CMP ou à une autre. Ils se mettent à jour automatiquement avec chaque nouveau résultat arithmétique. Par exemple, « Z » se met à un chaque fois que le résultat de la dernière opération est nul. Donc, dans le cas d'une soustraction en particulier, un résultat nul indique que les deux opérandes sont égales.

    Les instructions de saut conditionnel, elles, ne s'appuient que sur l'état de ces flags et sont encore moins liées avec les opérations précédentes. « JZ » et « JE », par exemple, sauteront vers l'adresse de destination si et seulement si « Z » est à un, peu importe que ce flag soit passé à cette valeur du fait de la dernière opération arithmétique ou que tu l'aies artificiellement forcé en modifiant EFLAGS à la main.
    le flag Z = 1 si resultat de soustraction est nulle,oui je suis d'accord.
    Il s'agit de soustraction virtuelle , oui je suis entiérement d'accord.

    mais comment détermine le flag A , puis P, puis C et S ?

  6. #6
    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 yann458 Voir le message
    mais comment détermine le flag A , puis P, puis C et S ?
    Tu aurais pu chercher un peu, le détail de ces flags n'étant pas difficile à trouver : http://en.wikipedia.org/wiki/EFLAGS .

    D'une manière générale, en essayant d'aborder l'assembleur de manière générale sur un grand panel de micro-processeurs et pas en se cantonnant au x86, et en essayant de faire un peu de logique combinatoire, avec de l'électronique. Si tu veux bien aborder l'assembleur, je te conseille d'explorer les micro-processeurs 8 bits tels que le 6809 ou le Z80, et les PIC contemporains. Le x86 est trop sophistiqué pour bien en percevoir le fonctionnement logique.

    Pour répondre à ta question :

    C = Carry = Retenue. C'est la retenue issue d'une opération arithmétique ou logique en binaire, qui fonctionne exactement de la même façon qu'une opération sur papier en décimal. Elle est extrêmement utilisée, même en tant que simple flag. Les x86 proposent même les instructions CLC et STC pour aller le modifier directement. Lors de décalages à gauche ou à droite, C récupère le bit sortant.

    Mais j'insiste sur le fait que sa principale fonction sert de retenue. Par exemple, en binaire, 1b + 1b = 10b. Je pose donc « 0b » et je retiens « 1b », dans ce flag.

    En outre, cette retenue est complémentée lors d'une soustraction : http://www.developpez.net/forums/d10...-cmp-derivees/

    A = Adjust = Retenue intermédiaire. C'est l'état de la retenue après 4 bits. C'était utile lorsque les micro-processeurs étaient majoritairement huit bits, et pour faire de la conversion BCD.

    S = Sign = Bit de signe. En binaire naturel, avec n bits, tu peux représenter une plage continue de 2^n nombres. Par défaut, ils sont tous positifs, comme les kilomètres sur le compteur kilométrique d'une automobile. Maintenant, si tu pars de zéro et que tu soustrait un, tu te retrouves avec 111111111b de la même façon que tu aurais 99999999 kilomètres sur une automobile. Par conséquent, tu divises ta plage en deux : le bas de la plage pour les nombres positifs et le haut de la plage pour les négatifs. Et comme, en binaire, il n'y a que deux chiffres, les nombres positifs commenceront donc forcément par 0 et les nombres négatifs par 1.

    Le bit S est donc l'image exacte du bit de poids fort du résultat.

    P = Parity = Bit de parité. Ça te dit si ton résultat est pair ou pas. Comme, en binaire, on travaille en base 2, un nombre pair finit forcément par 0, de la même façon qu'en décimal, un nombre multiple de dix finit forcément par 0 lui aussi. Comme ce bit fonctionne de manière similaire au bit Z et passe à un lorsque que ton nombre est pair, c'est donc l'image inversée du bit de poids faible du résultat.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    900
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 900
    Points : 85
    Points
    85
    Par défaut
    J'ai oublier pour le bit O

  8. #8
    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
    La réponse est derrière les liens que je t'ai proposés.
    Au travail, maintenant.

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

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 11h21
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 15h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 23h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 13h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 18h14

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