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 :

Optimisation ASM x86


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Points : 192
    Points
    192
    Par défaut Optimisation ASM x86
    Bonjour,

    Savez-vous comment optimiser certaines instructions :

    - comment faire pour faire un et ainsi éviter de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov eax, [ eax ]  
    call eax
    ?

    - faire une seule instruction au lieu de 3 lors d'un calcul.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax, [ edx ]
    		sub eax, [ ebp - 16 ]
    		add eax, [ ebp - 12 ]
    etc.

    merci

  2. #2
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Citation Envoyé par youp_db Voir le message
    - comment faire pour faire un et ainsi éviter de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov eax, [ eax ]  
    push eax
    ?
    Il faut donner à l'assembleur la taille de l'opérande. Avec FASM/NASM :
    Avec MASM :
    À la base je ne sais pas trop quelle forme est la plus avantageuse mais avec la micro-fusion (Pentium M et Core 2) ça doit être la deuxième.

    Citation Envoyé par youp_db Voir le message
    - faire une seule instruction au lieu de 3 lors d'un calcul.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax, [ edx ]
    		sub eax, [ ebp - 16 ]
    		add eax, [ ebp - 12 ]
    Dans ce cas-ci je ne vois pas comment faire mais on utilise LEA quand c'est possible. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lea ecx, [edx+eax*4]  ; ecx = edx + eax*4
    Il faut faire attention, si il y a juste un produit l'assembleur va être obligé "d'inventer" un terme à ajouter qui vaudra zéro. Par exemple cette instruction-là fait 7 octets :
    Alors que si on la réécrit comme ça elle n'en fait plus que 3 :
    Par contre FASM sait choisir la forme la plus courte donc avec cet assembleur-là ça n'aurait rien changé.
    :wq

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Points : 192
    Points
    192
    Par défaut
    Citation Envoyé par dapounet Voir le message
    Il faut donner à l'assembleur la taille de l'opérande. Avec FASM/NASM :
    Avec MASM :
    À la base je ne sais pas trop quelle forme est la plus avantageuse mais avec la micro-fusion (Pentium M et Core 2) ça doit être la deuxième.

    j'ai essayé mais apparement ca donne le contenu du contenu de eax et non le contenu simple...en revanche ca fonctionne avec les call, par exemple call dword ptr [ ebp - 32 ] fonctionne.

  4. #4
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Si le problème se pose toujours, voilà un exemple pour MASM32 :
    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
    24
    25
    26
    27
    28
    29
    30
    .686
    .model flat, stdcall
    option casemap:none
     
    include msvcrt.inc
    includelib msvcrt.lib
     
    CRLF  equ  10
     
    .const
            format_d  db  "%d", CRLF, 0
     
    .data
            var  dd  100
     
    .code
    main proc
            mov eax, offset var
            push [eax]  ; là il n'y a pas besoin de préciser la taille, ça dépend de
                        ; l'assembleur apparemment
            pop eax
     
            invoke crt_printf, addr format_d, eax
            invoke crt_getchar
     
            xor eax, eax
            ret
    main endp
     
    END main
    :wq

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 145
    Points : 170
    Points
    170
    Par défaut
    Je ne sais pas si ce genre de question a réellement beaucoup de sens. A propos de ce type d'optimisation, je cite D. Knuth :
    "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."

    Sinon, il existe une littérature exhaustive sur le sujet pour les optimisation sur les proc Intel actuels :

    Intel® 64 and IA-32 Architectures Optimization Reference Manual

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

Discussions similaires

  1. Probleme emulateur asm x86 en c#
    Par hardcpp dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 15/01/2014, 16h49
  2. Probleme emulateur asm x86 en c#
    Par hardcpp dans le forum C#
    Réponses: 0
    Dernier message: 13/01/2014, 16h07
  3. Réponses: 1
    Dernier message: 08/01/2013, 19h17

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