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 :

xorq: Error: suffix or operands invalid for `xor'


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut xorq: Error: suffix or operands invalid for `xor'
    Bonjour, j'ai un soucis avec xorq. J'obtiens ce message : Error: suffix or operands invalid for `xor'.

    c'est quand j'exécute cette instruction peu importe le registre %rax, %rbx, %rdi, etc.:

    xorq $17179869184, %rdi

    alors que si j'utilise un chiffre inférieur à 2^31 (2147483648) il n'y a pas de problème en compilant.

    Quelqu'un pourra m'aider svp? J'utilise une machine 64bits

    Merci :-)

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    passe à fasm.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    j'utilise gcc.
    est ce que c'est possible d'utiliser fasm avec gcc ?

  4. #4
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    le premier opérande d'un instruction est la destination donc essaye plutôt:

    xorq %rdi , $17179869184

    $17179869184 semble être une constante, et ont ne peut pas mettre le résultat d'une opération dans une constante

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par bifur Voir le message
    le premier opérande d'un instruction est la destination
    Malheureusement, ça dépend. En syntaxe AT&T, ça a tendance à être le contraire.

  6. #6
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    ça dépend de quoi? du type d'instruction je suppose mais quel est la règle? (j'aimerais savoir si un jour je recontrer une source en at&t)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    en AT&T la source est la première opérande.
    J'ai trouvé la solution à ce problème içi:
    http://www.x86-64.org/documentation/assembly.html

    dans "immediates" c'est noté que en X86-64, les valeurs immédiates sont considérées comme 32 bits et pas 64 bits.
    c'est pour ça il faut mettre la valeur dans un registre et puis faire xorq.

    au lieu de faire:
    xorq $17179869184, %rdi

    solution:
    pushq %rax
    movq $17179869184, %rax
    xorq %rax, %rdi
    popq %rax

  8. #8
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    solution en syntaxe intel au lieu de at&t:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    solution:
    push rax
    mov rax,17179869184h
    xorq rdi,rax
    pop rax
    le code gagne en lisibilité.

    les compilos en syntaxe intel sont:
    fasm
    tasm
    nasm
    masm

    ensuite, il y a les compilos en ideal mode, c'est à dire qu'au lieu d'utiliser des adresses bizarres du style mov eax,offset ptr gs[edi][ECX*4][1000] (ce qui est super lourd à digerer comme syntaxe à la longue), il y a des compilos qui utilisent des adresses en ideal mode, c'est dire comme ça mov eax,[gs:edi+ecx*4+1000] ce qui est plus leger à lire vous en conviendrez.

    mais malheureusement, lorsque l'on utilise GAS, c'est à dire le compilo de GCC, on est forcés d'utiliser la pauvre syntaxe AT&T, qui malgré sa laideur est plus logique que les autres.
    en binaire, les operandes sont dans le meme ordre que l'AT&T. source en premier, destination en second, ce qui est logique car en interne, le CPU va d'abord charger la source avant d'utiliser la destination.

    c'est aussi la syntaxe du compilo GCC, en interne, il traduit le code C en code AT&T, qui à son tour est traduit en binaire par GAS.
    donc, impossible d'utiliser un autre compilo dans GCC (je crois).

    pour xor rax,123456789h, on peut tout simplement pas, car les operations n'acceptent que des valeurs 32 bits positives (31 bits donc), car elles seront sign extended. enfin, c'est etrange qu'intel n'ai pas decidé de supporter les valeurs 64 bits pour les operations.
    seul mov accepte des imm de 64 bits on dirait.

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

Discussions similaires

  1. [Web Services] [Spring WS]error no endpoint mapping foound for SaajSoapMessage
    Par aymen83 dans le forum Spring
    Réponses: 1
    Dernier message: 24/11/2008, 10h19
  2. [Turbo Pascal] Runtime error 105 - File not open for output
    Par infoz dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 03/06/2008, 15h48
  3. Réponses: 6
    Dernier message: 19/05/2008, 12h28
  4. signal `toggle' is invalid for instance
    Par labrute dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 15/05/2008, 09h13
  5. Réponses: 1
    Dernier message: 30/03/2007, 00h53

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