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 :

[GCC] Output étrange


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut [GCC] Output étrange
    Bonjour,

    Je jouais un peu avec mon compilateur (gcc) et un output assembleur me perturbe...
    Voici le code C :
    et sa sortie en asm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mov DWORD PTR [ebp-4],0x2
    mov edx,DWORD PTR [ebp-4]
    mov eax,edx
    sar eax,0x1f
    shr eax,0x1f
    lea eax,[edx+eax]
    sar eax
    mov DWORD PTR [ebp-4],eax
    Je ne comprend pas ces 3 instructions pourquoi ne pas utiliser uniquement shr eax,0x1f ?
    Voila ce que je comprend :

    1) sar eax,0x1f
    Cette instruction permet d'enlever le signage.
    2) shr eax,0x1f
    décale vers la droite de 1 (0x1f = 1 et non 31 ?)
    3) sar eax
    je ne comprend pas...

    Sinon est-ce que quelqu'un pourrait me montrer comment serait ce code en ASM AT&T ?

    Merci !

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Koe,
    Citation Envoyé par yamashi Voir le message
    1) sar eax,0x1f
    Cette instruction permet d'enlever le signage.
    Au contraire, sar décale en gardant le signe, ce qui fait que

    SI eax était positif ou nul, alors eax = 0, SINON eax = -1 (que des 1)

    Citation Envoyé par yamashi Voir le message
    2) shr eax,0x1f
    décale vers la droite de 1 (0x1f = 1 et non 31 ?)
    On décale de 31 vers la droite, en faisant entrer des 0 par la gauche.
    Donc, avec le résultat de l'instruction précédente,
    SI eax était positif ou nul, donc devenu = 0, il reste à 0
    SINON il était négatif, devenu -1, il devient = 1

    PUIS
    revient à mettre edx+eax dans eax, donc
    SI la valeur était positive au départ, on lui ajoute 0,
    SINON on lui ajoute 1

    Citation Envoyé par yamashi Voir le message
    3) sar eax
    je ne comprend pas...
    et enfin, on divise par 2, en gardant le signe.

    Citation Envoyé par yamashi Voir le message
    Sinon est-ce que quelqu'un pourrait me montrer comment serait ce code en ASM AT&T ?
    J'ai supprimé les instructions qui gèrent l'adressage dans la pile, c'est simple à refaire si tu en as besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int f(int y)
    {
        __asm__ (
            "movl %0,%%edx\n"
            "mov  %%edx,%%eax\n"
            "sar  $0x1f,%%eax\n"
            "shr  $0x1f,%%eax\n"
            "lea  (%%edx,%%eax),%%eax\n"
            "sar   $1,%%eax\n"
            :
            : "m" (y)
            : "%eax", "%edx"
        );
    }
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut
    Merci pour ta super explication.

    Mais pourquoi ne pas faire sar eax directement car si j'ai bien compris les instructions du dessus ne font que vérifier si le nombre est signé donc elle ne sont pas importantes ?

    merci encore

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Hello,

    En fait, en utilisant SAR pour effectuer une division, ne renvoit pas toujours
    la même valeur si le nombre est positif ou négatif.

    C'est une question d'arrondi

    Par exemple : si EAX = 3
    SAR EAX,1 donnera 1 car 3/2 = 1.5 et le .5 est perdu

    Par contre, si EAX = -3
    SAR EAX,1 donnera -2

    Donc en ajoutant 1 à la valeur initiale quand cette derniere est négative, on
    évite ce problème.

    a+ François

  5. #5
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Je ne comprend pas ces 3 instructions pourquoi ne pas utiliser uniquement shr eax,0x1f ?
    Dans ton cas très particulier (tu connais "y" et ses caractéristiques) shr eax 1 serait effectivement suffisant et nettement plus rapide.

Discussions similaires

  1. les .a avec gcc
    Par Groove dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 31/03/2003, 08h59
  2. gcc et win32
    Par MatRem dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 16/01/2003, 13h22
  3. getch() avec gcc
    Par Jorus dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/12/2002, 15h47
  4. Réponses: 1
    Dernier message: 13/11/2002, 21h34
  5. [Kylix] gcc et kylix
    Par alexsmadja dans le forum EDI
    Réponses: 1
    Dernier message: 28/05/2002, 11h00

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