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 :

Rapidité entre deux instructions 16 bits et 32 bits


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut Rapidité entre deux instructions 16 bits et 32 bits
    Bonjour. Il y a quelques jours, je me suis posé la question de savoir laquelle de ces deux instructions étaient la plus rapide pour n'importe quels processeurs aceptants ces instructions :
    mov bx, dx
    mov ecx, edx
    La première instruction déplace moins de données (16 bits), cependant elle est plus longue (taille) que la deuxième : (valeur hexadecimale) 66:8BDA
    La deuxième instruction déplace plus de données (32 bits), cependant elle est moins longue (taille) que la première : (valeur hexadecimale) 8BDA

    Pour répondre à ma question, j'ai fais un bout de code pour voir laquelle prennait le plus de cycle du processeur :
    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
    MOV ECX,-1
    label1:LOOPDNE label1    ;//Juste un petit échauffement
     
    RDTSC                    ;//Récupère le nombre de cycles écoulés jusqu'à appel de cet instruction
    MOV ECX,1000
    label2:MOV BX,DX
    LOOPDNE label2           ;//On fait digèrer 1000 fois l'instruction [MOV BX,DX] -> une fois ne m'aurait pas donné une marge de différence entre les deux instructions
    MOV ECX,EAX
    RDTSC
    SUB EAX,ECX              ;//On récupère le nombre de cycle écoulés entre les deux RDTSC.
    PUSH EAX
     
    MOV ECX,-1
    label3:LOOPDNE label3    ;//Encore un échauffement, puis comme en haut...
     
    RDTSC
    MOV ECX,1000
    label4:MOV EBX,EDX
    LOOPDNE label4
    MOV ECX,EAX
    RDTSC
    SUB EAX,ECX
    PUSH EAX
    J'ai utilisé cette procédure 5 fois et voici les résultats :
    Première :
    Boucle du [MOV BX,DX] : 2121 (cycles)
    Boucle du [MOV EBX,EDX] : 210B
    (16h cycles de différence)
    Deuxième :
    Boucle du [MOV BX,DX] : 2121 (cycles)
    Boucle du [MOV EBX,EDX] : 2100
    (21h cycles de différence)
    Troisième :
    Boucle du [MOV BX,DX] : 2116 (cycles)
    Boucle du [MOV EBX,EDX] : 2100
    (16h cycles de différence)
    Quatrième :
    Boucle du [MOV BX,DX] : 2116 (cycles)
    Boucle du [MOV EBX,EDX] : 210B
    (0Bh cycles de différence)
    Cinquième:
    Boucle du [MOV BX,DX] : 210B (cycles)
    Boucle du [MOV EBX,EDX] : 2100
    (0Bh cycles de différence)

    J'en tire les conclusions : Bien que l'instruction [MOV EBX,EDX] déplace plus de données elle est plus rapide que l'instruction [MOV BX,DX].
    Ma question : POURQUOI? (qu'est-ce qui joue exactement?)
    (Je me serais attendu à l'inverse...)

    Merci

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Il me semble que l'explication tient dans l'adressage :
    En 16 bits, le processeur doit charger des demi-données. Il est obligé de se caler sur des "demi-cases" mémoires.
    En 32 bits, il travaille sur des adresses entières, qu'il sait manipuler avec efficacité.
    Bref, il est plus rapide pour un processeur 32 bits d'incrémenter le pointeur d'adresses de 4 octets que de deux.

    Le problème était différent sur les processeurs 16 bits Intel, qui avaient un registre d'adresses sur 20 bits...

    Voilà. J'espère avoir été clair.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Merci.
    J'étais parti sur cette piste également. Cependant, je pensais que le déplacement mémoire influait plus que l'addressage.

  4. #4
    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
    En fait, la taille des données importe peu. Le bus fait de toute façon 32 bits sur une architecture intel 32. Ca coûte rien pour le proc d'utiliser que la moitié du bus. On peut utiliser des instructions comme movz r32, r8, où directement des instructions 8 bits.

    Mais en fait, il y a le préfixe d'opérande qui est pénible. le "66:" que vous avez écrit plus haut. Il oblige le processeur à passer en mode d'opérande 16 bits.

    Quoiqu'il en soit, le problème dépend du processeur. Certains indiquent clairement une pénalité d'un cycle pour chaque préfixe d'opérande avalé.

    Le problème de l'alignement est très compliqué. Pour exemple, certains procs ont des pénalités lorsqu'on accède deux fois au même mot mémoire.

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

Discussions similaires

  1. Faire un ET binaire entre deux chaines de bits.
    Par rufa11 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 14/05/2014, 09h04
  2. Problème de ligne vide entre deux instructions
    Par korian dans le forum PL/SQL
    Réponses: 2
    Dernier message: 25/11/2010, 09h28
  3. mettre une pause entre deux instructions
    Par christianf dans le forum C#
    Réponses: 3
    Dernier message: 21/02/2008, 14h43
  4. Problème temporisation entre deux instructions
    Par Bubur dans le forum Flash
    Réponses: 1
    Dernier message: 03/12/2006, 01h01
  5. [Oracle / Sql] Et logique entre deux bits
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 5
    Dernier message: 15/03/2005, 14h35

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