Boucle infinie avec un for (et si)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 399 fois - Téléchargée 30 fois

Contenu du snippet

Bon çà n'a aucun intérêt dans ce cas, mais dans un for j'avais cherché à incrémenter le compteur pour sauter les valeurs paires... Et voici l'astuce que j'avais trouvé, Delphi refusant qu'on touche à la variable compteur...

Source / Exemple :


program toto;

{$APPTYPE CONSOLE}

uses SysUtils;

var i: Integer;

begin
  for i := 0 to 1 do begin
    writeln('i=', i);
    asm
      mov eax, i
      sub eax, 1
      mov i, eax
    end;
  end;
end.

Conclusion :


Je sais que çà ne sert à rien là, pas la peine de demander l'intérêt :p

A voir également

Ajouter un commentaire

Commentaires

cs_Amadeos
Messages postés
1
Date d'inscription
mercredi 22 septembre 2004
Statut
Membre
Dernière intervention
16 mars 2006
-
asm
mov i,0 //1 cycle.
end

En 1 instructions simples.. ca doit marcher. le but c'est d'etre dans la vbl.
cs_Zeroc00l
Messages postés
370
Date d'inscription
lundi 1 avril 2002
Statut
Membre
Dernière intervention
11 février 2010
-
Intéressant comme méthode pour contourner la propreté d'un code... :p

Une question :
Dans une procédure j'initialise pas mal de valeurs.
Parmis ces valeurs, deux sont des Integer... parfaites pour faire des compteurs de boucle avant d'être initialisé à zéro. On évite ainsi la création de deux variables, ce qui prend du temps pour allouer la mémoire et la libérer.
Pour l'initialisation ce n'est pas très important mais pour d'autres procédure souvent appelées ça peut se révéler sympathique comme optimisation...

Le problème est que lorsque j'essaye de compiler, Delphi me dit que ces deux variables ne sont pas créées dans la procédure et, donc, que je ne peux pas y accéder en tant que variable de boucle "For".

Comment en assembleur pourrait-on faire pour que eax (et ebx pour la deuxieme boucle ) se retrouvent avec les bonnes valeurs qui me permettraient de gagner un petit peu de temps (*1 000 000 ca fait bcp).
Mais cela n'est valable que si il y'a besoin d'écrire une ligne de code spécifique pour mettre en place eax et ebx ...

Merci d'avance !
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Bah, de toute façon, sur un 586 :

mov reg, mem ; 1 cycle
add eax, 1 ; 1 cycle
mov mem, reg ; 1 cycle

=> 3 cycles au total

add mem, imm ; 3 cycles

=> 3 cycles aussi

Conclusion : aucune importance dans ce cas :p
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Ah ben la voila cette fameuse source :p

Désolé d'avoir réinventé la roue, mais comme je l'ai dit dans l'intitulé de la source, je ne voulais pas assigner une constante mais avoir un pas de 2, cad i=0,2,4,6,8,etc... D'ou l'utilisation d'EAX pour ajouter 1 à i (j'ai pas testé ADD i, 1 mais je suppose que çà doit marcher aussi)...

Voila, @+
cs_bgK
Messages postés
136
Date d'inscription
vendredi 7 juin 2002
Statut
Membre
Dernière intervention
19 janvier 2004
-
Personellement, j'utilise ((Valeur and 1) = 0) pour savoir si un nombre est pair. à mon avis, c'est le plus rapide (sans utiliser l'assembleur)
Par contre, je ne conaissais pas Odd non plus ... merci ...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.