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 :

Utiliser une instruction MMX


Sujet :

x86 32-bits / 64-bits Assembleur

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Utiliser une instruction MMX
    Bonjour

    Je cherche a effectuer un ROL (rotation vers la gauche) d'un registre MMX.

    La doc Intel nous dit que c'est possible (mais malheureusement par d'intrinsic!) , par ex:
    ROL r/m64, 1

    Ok alors j'essaye d'inclure une ligne assmleur en C sous GCC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    __m64 A; // initialisation d'un registre MMX
       A = _mm_set_pi8(0x01, 0x01, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff); // charge des valeurs dans A
    asm("	ROL %mm0,1\n\t");  // sense faire un rol
    et là l'assembleur me dit :
    Error: suffix or operands invalid for `rol'
    Quelqu'un peut m'aider???

    Merci

  2. #2
    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
    r/m64 ce n'est pas mm ou xmm... Ca ressemble à une opérande de processeur 64 bits. Les instructions MMX possèdent des mnémoniques propres. Malheureusement, je ne trouve pas de rotation MMX, seulement des translations. Vous voulez agir sur des données paquetées (Je ne connais pas le terme français de "packed") ou simplement des entiers 64 bits ?

    Je dis tout cela avec une grande réserve car j'connais pas beaucoup les SIMD...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    La notationcorrespond à la rotation d'un registre (r) ou d'une mémoire (m64) 64 bits, et n'a rien à voir avec les mmx
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Pour les décalages voir : "MMX Technology Shift Intrinsics" sur la MSDN.

    http://msdn2.microsoft.com/en-us/library/s9fcy11x.aspx

    Ensuite, plus d'infos sur chaque instructions dans les manuels Intel (2A et 2B).

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Rotation d'un registre 64 bits
    Merci pour vos reponses.

    C'est bien un ROL que je veux faire, et non un SHIFT. Car sinon j'utiliserais les intrinsics.

    D'autre part, j'appelle registre MMX celui qu'on initialise avec __m64, mais le nom m'importe peu...

    Et la doc intel nous dit bien qu'on peut faire un ROL r/m64, 1

    C'est tout ce que j'espere arriver a faire...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par pierabobl
    Merci pour vos reponses.

    C'est bien un ROL que je veux faire, et non un SHIFT. Car sinon j'utiliserais les intrinsics.

    D'autre part, j'appelle registre MMX celui qu'on initialise avec __m64, mais le nom m'importe peu...

    Et la doc intel nous dit bien qu'on peut faire un ROL r/m64, 1

    C'est tout ce que j'espere arriver a faire...
    Re.
    Comme déjà dit,
    n'a rien à voir avec mmx.

    Et si, le nom importe beaucoup, sinon comment se comprendre ?
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    OK
    Donc ca veux dire qu'il y pas moyen de faire un ROL sur un registre 64 bit...

    On peut pas dire que ce soit limpide dans la doc Intel.

    Aucune idee si on peut le faire en C?

    Merci

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Comment faire un ROL
    Je suis tout de meme curieux (et interesse) de savoir comment on peut utiliser l'instruction ROL

    exemple:
    register long B = 0x0800;
    asm(" ROL $1, B\n\t");

    Marche pas!!!

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    tu peux toujours passer la partie basse d'un MMX (64 bits) sur les 64 bits d'un GPR (General Purpose Register, tel que RAX, RBX, etc.), faire le ROL ou le ROR sur le registre de l'ALU et repasser de l'ALU au MMX.

    Par contre, niveau temps d'exécution, je doute que ce soit très efficient...

    Pour le passage d'un MMX sur un registre de l'ALU et vice-versa, regarde à l'instruction MOVD :

    MMX vers ALU :
    MOVD reg/mem64, xmm | 66 0F 7E /r | Move 64-bit value from an XMM register to a 64-bit general purpose register or memory location.
    ALU vers MMX :
    MOVD xmm, reg/mem64 | 66 0F 6E /r | Move 64-bit value from a general-purpose register or 64-bit memory location to an XMM register.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Désolé, je ne connais pas la syntaxe de gcc pour l'assembleur, mais tous les exemples que j'ai rapidement regardés ont en commun :
    - pas d'espace au début,
    - mnémoniques en minuscules (?)
    - les mnmoniques sont différents de ceux pour la syntaxe Intel.

    Cheche de ce côté là.

    --------------

    Je vois, par l'exemple que tu as donné dans le forum C, que tu travailles avec une valeur 32 bits, d'où vient alors ton problème avec des 64 bits mmx (?)

    En donnant plus de précisions sur ton problème, tu aurais sans doute eu plus rapidement des réponses plus précises.
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Ok,
    A la base je voulais utiliser les registre de 64 bits pour pouvoir traiter des plus grandes series de bit.

    je laisse tomber le MMX

    je vais essayer avec un registre classique

    Merci a vous

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Si tu veux utiliser une valeur 64 bits pour faire un rol simultané de 2 valeurs 32 bits, tu vas droit vers des problèmes:
    les bits vont passer d'une valeur à l'autre, et je ne pense pas que ce soit ce que tu veux (?).

    D'autre part, si tu voulais utiliser un registre mmx, il fallait utiliser une instruction mmx, et ne pas mélanger avec les instructions des registres généraux et mémoire.
    (On ne mélange pas les serviettes et les torchons, dit la sagesse populaire, qui en l'occurrence a raison)
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  13. #13
    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
    Pour les décalage de 1 seulement il est possible de faire rentrer le carry flag dans la danse, pour faire des rotations sur des entiers arbitrairement longs (successions de nombres codés 32bits, ou nombres en base 2^32)

    En syntaxe intel, et le nombre 64bits dans eax:edx (à remplacer éventuellement par des variable64[0], variable64[1])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    clc         ; Clear Carry
    rcl eax, 1
    rcl edx, 1
    adc eax, 0
    Pour augmenter la rapidité, il peut être intéressant de remplacer clc par un masquage après le premier rcl.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    J'ai depuis jeté un coup d"oeil sur la syntaxe de gcc pour l'asm inline,

    et l'instruction nécessaire, pour une variable u de type int sur 32 bits, est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    asm("roll $1,%0" : : "m"(u));
    Bien entendu, ce n'est pas du mmx
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

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

Discussions similaires

  1. [WD-2007] Utiliser une variable dans une instruction SQL - publipostage
    Par paulinegue dans le forum VBA Word
    Réponses: 5
    Dernier message: 03/08/2011, 11h10
  2. Réponses: 2
    Dernier message: 26/07/2010, 18h45
  3. Réponses: 16
    Dernier message: 26/03/2010, 11h04
  4. Réponses: 16
    Dernier message: 15/09/2008, 08h24
  5. Réponses: 2
    Dernier message: 31/01/2008, 13h59

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