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

Assembleur Discussion :

Principe de l'instruction LOOP


Sujet :

Assembleur

  1. #1
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut Principe de l'instruction LOOP
    Bonjour voila je comprend pas trés bien le principe de l'instruction loop
    qulqu'un pourai m'aider

    Et au fait qu'es ce que veut dir cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    source BYTE "dndndndnd"
    target  BYTE SIZEOF source DUP(0), 0
    Si grande est la faiblesse d'une âme, dont la raison est partie!
    Ne jamais embrouiller ni abasourdir par une foule d'images le génie intérieur qui réside au fonde de sa poitrine,...
    L'ambition est le rfuge de l'échec. "Oscar Wild"

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    L'instruction LOOP est exactement la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DEC ECX  ; ou CX en mode 16 bits
    JNE xxx
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 96
    Points : 116
    Points
    116
    Par défaut
    Vi sauf que loop est plus lent que
    donc il est à éviter

    Et puis il ne fait tt à fait la meme chose: il ne modifie pas les flags
    Responsable du projet SKAN (OS à but didactique)
    Contactez moi pour toutes questions ou remarques sur le projet.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Pour la rapidité de LOOP ou de DEC/JNZ, ça dépend du processeur. Sur certains, la première options est plus rapide que la seconde, sur d'autre c'est l'inverse.

  5. #5
    Membre actif
    Avatar de mathk
    Inscrit en
    Décembre 2003
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 211
    Points : 233
    Points
    233
    Par défaut
    o ok merci mais juste un détail elle s'arret quant ta boucle DEC ECX JNE
    Si grande est la faiblesse d'une âme, dont la raison est partie!
    Ne jamais embrouiller ni abasourdir par une foule d'images le génie intérieur qui réside au fonde de sa poitrine,...
    L'ambition est le rfuge de l'échec. "Oscar Wild"

  6. #6
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mov CX, iterations
    etiq:
    ...
    dec ecx
    jne etiq
    ...
    c plus clair là ?
    quand ECX = 0 on sort de la boucle

    bon dev'

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Il est vrai que je n'avais jamais fait attention au fait que LOOP ne modifie pas les flags

    Par contre pour la vitesse, j'avais déjà noté cette différence sur les processeurs récents. Et je ne l'utilisait plus.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 96
    Points : 116
    Points
    116
    Par défaut
    Sur certains, la première options est plus rapide que la seconde, sur d'autre c'est l'inverse.
    oui sur les 8086 c plus rapide mais ca existe plus depuis 15 ans et on s'en fout.
    Responsable du projet SKAN (OS à but didactique)
    Contactez moi pour toutes questions ou remarques sur le projet.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    C'est ce qu'il parait...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Précision sur LOOP. L'UNIQUE processeur sur lequel elle est plus rapide que DEC/JNZ est le P4. Sur TOUS les
    autres, Y COMPRIS L'ANTIQUE 8086, c'est plus lent. AUCUN compilateur n'utilise plus cette instruction depuis bien longtemps...
    Encore un mystère du P4.

    A+

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Voilà ce que dit la doc de MASM32:

    LOOP is faster and smaller on 8088-286. On 386+ DEC/JNZ is much faster. On the Pentium the DEC/JNZ instructions pair taking only 1 cycle.

  12. #12
    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
    moi je remettrais pas en doute AMILIN, surtout pour une doc faite par des Mrcrosoftiens.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Je ne remets rien en doute. Je ne me serais pas permis étant donné que je n'ai pas d'avis dessus.
    J'ai juste mis cet extrait à titre d'information. Le lecteur eventuel remets ensuite en doute ce qu'il veut.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Blustuff
    moi je remettrais pas en doute AMILIN, surtout pour une doc faite par des Mrcrosoftiens
    Mais si mais si !!! J'ai été un peu trop catégorique...

    Pour clore le débat, sur le papier LOOP est effectivement légérement plus rapide (en comptant les cycles dans le cas optimal) que DEC/JNZ sur 8086/286.
    Toutefois, même sur ces processeurs, il y a bien longtemps que l'on a appris à utiliser plutôt DEC/JNZ. Sur les proc > et autre que le P4, c'est à ABOLIR.

    Par exemple, sur Athlon, DEC/JNZ prend (cas optimal) 1 cycle. De plus, ce sont deux instrutions 'simple' (DirectPath dans le jargon AMD). LOOP prend 8 cycles et est une instruction complexe (VectorPath).

    Le cas du P4 est plus nuancé: DEC/INC doivent être évité car, apparemment, CF n'est pas renommé séparemment ce qui fait que ces instructions dépendent de TOUTES les modifications de flags précédentes (je rappelle que CF n'est pas modifié par DEC/INC et que les processeurs récent font du renommage de registre). Et ceci n'est pas indiqué si l'on consulte les cycles sur le papier... Donc, selon les boucles, LOOP est plus rapide sur ce proc !

    A+

  15. #15
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut Re: [LOOP]
    Citation Envoyé par mathk
    Et au fait qu'es ce que veut dir cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    source BYTE "dndndndnd"
    target  BYTE SIZEOF source DUP(0), 0
    Je pense que c'est la 2ème ligne qui pose problème
    SIZEOF source correspond à la taille de "source" ce qui serait je pense 9 octets ... mais source représentant en théorie un emplacement mémoire je ne trouve pas cela très rigoureux ...
    Enfin au final tu auras en mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           d n d n d n d n d 0 0 0 0 0 0 0 0 0 0
    source ^          target ^                 ^ zéro "supplémentaire"
    Avant de poster, merci de consulter les règles du forum

  16. #16
    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
    et
    ??

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Sauter à ... si ECX vaut zéro après avoir été décrémenté.

    En C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int ecx = MA_VAR
    do 
    {
        // code...
    } while (--ecx)

    En ASM.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mov ecx, MA_VAR
    label:
    ;code...
    dec ecx
    jnz label

    dec a et sub a, 1 sont equivalent à la difference près que sub modifie CF.[/b]

  18. #18
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Blawk
    dec a et sub a, 1 sont equivalent à la difference près que sub modifie CF
    Mais différence importante Blawk. Si tu fais des calculs en chaîne avec propagation de retenue il est important de ne pas détruire CF (exemple l'addition en multi-précision en base 2^32: un cas ou le passage par l'ASM est obligatoire avec l'instruction ADC)

    Mais je pense que Blustuff voulait savoir si sub .,1 est mieux que dec sur P4 et c'est bien le cas !!!! Le problème, comme tu l'as noté, est CF.

    A+

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    Mais alors c'est quoi le mieux sur P4 ?
    sub, jnz ou loop ??

  20. #20
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Petit essai rapide pour répondre, boucle simple faite avec LOOP ou DEC/JNE

    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
    procedure TForm1.Button3Click(Sender: TObject);
    Var i,t:Integer;
        h:DWord;
    begin
      t:=0;
      H:=GetTickCount;
      For i:=1 To 10000 Do
      Asm
        MOV ECX,10000
        XOR EAX,EAX
    @@L1:
        ADD EAX,i
        DEC ECX
        JNE @@L1
        ADD T,EAX
      End;
      ShowMessage(IntToStr(GetTickCount-h));
    end;
    Sur PIII : 930 ms avec LOOP, 440 ms avec DEC/JNE
    Sur PIV : 109 ms dans les deux cas.

    Si ces résultats se confirmes, ( si tu essayes... ) alors au pire tu ne gagne rien avec DEC/JNE mais dans les autres cas tu gagnes beaucoup. J'avais déjà noté cette différence en faisant des essais d'optimisation en ASM de procédures sur un PIII.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

Discussions similaires

  1. Instruction Do Loop
    Par Lorenzole+bo dans le forum VBA Access
    Réponses: 6
    Dernier message: 09/09/2007, 18h25
  2. Principe de l'instruction Xor
    Par ..::snake::.. dans le forum Assembleur
    Réponses: 18
    Dernier message: 02/06/2007, 01h48
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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