cs_Djidane1208
Messages postés10Date d'inscriptionmercredi 29 janvier 2003StatutMembreDernière intervention 5 juin 2003
-
5 juin 2003 à 09:28
cs_Amadeos
Messages postés1Date d'inscriptionmercredi 22 septembre 2004StatutMembreDernière intervention16 mars 2006
-
16 mars 2006 à 18:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Amadeos
Messages postés1Date d'inscriptionmercredi 22 septembre 2004StatutMembreDernière intervention16 mars 2006 16 mars 2006 à 18:36
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és367Date d'inscriptionlundi 1 avril 2002StatutMembreDernière intervention11 février 2010 4 mai 2004 à 21:34
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és787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 8 juin 2003 à 01:03
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 8 juin 2003 à 01:00
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és131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004 5 juin 2003 à 18:01
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 ...
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 5 juin 2003 à 17:55
Bah, j'y regarde bien, mais y'a tellement de trucs que c'est tantôt décourageant (on passe son temps à chercher une fonction au milieu d'une pléthore de propositions), tantôt encourageant (quand on tombe sur une fonction qui fait exactement ce qu'on veut... c'est quand même bien foutu Delphi, d'ailleurs je l'apprécie vraiment depuis que je me suis mis au C, mdr)
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 5 juin 2003 à 17:14
Y a pas de quoi !!
Tu sais, tu peux chercher dans le fichier d'aide de Delphi... En recherchant dans les unités par catégories de fonctions, ça te permet souvent de trouver ce que tu veux !
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 5 juin 2003 à 12:43
Odd() ? je la connaissais pa celle là, merci :p
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 5 juin 2003 à 12:27
Effectivement, ça permet de faire sauter le modulo... Mais à ce moment là, utilise la fonction Odd(), qui renvoie true si le nombre passé en paramètre est pair !!
(C'est ce que je voulais mettre à côté de "Ou que", mais j'ai du zapper !! ;o) )
Sinon, Emandhal, ce source est déjà sorti, disons... indirectement !
Elle avait pour but de modifier la variable (comme ici !) pour refaire un ou plusieurs tours de boucles si jamais il y avait besoin, pendant un traitement de données par exemple ! Mais c'es vrai que ça revient au même dans le principe...
Bonne prog' !
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 5 juin 2003 à 11:55
Emandhal > Je sais pas s'il était déjà sorti, c'est possible, je suis surement pas le premier crétin à faire un truc pareil :p
Klem> Certes mais dans la boucle originale je voulais que le compteur aie un pas de 2, donc je faisais un ADD EAX, 1 et çà marchait impec (i = 0, 2, 4, 6, etc...)
Bestiol> moui mais l'asm présente l'avantage de faire sauter le calcul du modulo (bon en meme temps, avec les processeurs actuels, en a t'on vraiment besoin ?)
Emandhal
Messages postés194Date d'inscriptiondimanche 2 mars 2003StatutMembreDernière intervention10 octobre 20063 5 juin 2003 à 11:07
Il était pas déjà sortit ce code sur ce site? Parce que ça me dit quelquechose...
cs_klem
Messages postés30Date d'inscriptionvendredi 25 octobre 2002StatutMembreDernière intervention27 septembre 2005 5 juin 2003 à 11:03
Tu aurait aussi pu réduire ton code asm à une ligne :
mov i, 0
ce qui marche aussi bien...
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 5 juin 2003 à 10:10
Ah... un autre petit commentaire :
Pour sauter les valeurs paires, il te suffisait d'effectuer les instructions de ta boucle que si (i mod 2 <> 0) !!
Ou que
Pas besoin d'assembleur pour ça !!
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 5 juin 2003 à 10:07
Et non !! C'est obligatoire de faire ça en assembleur... Sinon, le compilateur te mettra une erreur à la compilation : "Affectation à la variable dfe boucle impossible" !!
L'asm est donc justifié... Mais c'est vrai qu'en elle-même, cette boucle ne sert à rien, car on peut faire While True Do ...
cs_Djidane1208
Messages postés10Date d'inscriptionmercredi 29 janvier 2003StatutMembreDernière intervention 5 juin 2003 5 juin 2003 à 09:28
Je ne comprend même pas pourquoi t as mis ça en asm...
Il suffit de soustraire à la variable de boucle 1 à chaque fois comme ça la variable de boucle n'augmente pas...
16 mars 2006 à 18:36
mov i,0 //1 cycle.
end
En 1 instructions simples.. ca doit marcher. le but c'est d'etre dans la vbl.
4 mai 2004 à 21:34
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 !
8 juin 2003 à 01:03
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
8 juin 2003 à 01:00
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, @+
5 juin 2003 à 18:01
Par contre, je ne conaissais pas Odd non plus ... merci ...
5 juin 2003 à 17:55
5 juin 2003 à 17:14
Tu sais, tu peux chercher dans le fichier d'aide de Delphi... En recherchant dans les unités par catégories de fonctions, ça te permet souvent de trouver ce que tu veux !
5 juin 2003 à 12:43
5 juin 2003 à 12:27
(C'est ce que je voulais mettre à côté de "Ou que", mais j'ai du zapper !! ;o) )
Sinon, Emandhal, ce source est déjà sorti, disons... indirectement !
Elle avait pour but de modifier la variable (comme ici !) pour refaire un ou plusieurs tours de boucles si jamais il y avait besoin, pendant un traitement de données par exemple ! Mais c'es vrai que ça revient au même dans le principe...
Bonne prog' !
5 juin 2003 à 11:55
Klem> Certes mais dans la boucle originale je voulais que le compteur aie un pas de 2, donc je faisais un ADD EAX, 1 et çà marchait impec (i = 0, 2, 4, 6, etc...)
Bestiol> moui mais l'asm présente l'avantage de faire sauter le calcul du modulo (bon en meme temps, avec les processeurs actuels, en a t'on vraiment besoin ?)
5 juin 2003 à 11:07
5 juin 2003 à 11:03
mov i, 0
ce qui marche aussi bien...
5 juin 2003 à 10:10
Pour sauter les valeurs paires, il te suffisait d'effectuer les instructions de ta boucle que si (i mod 2 <> 0) !!
Ou que
Pas besoin d'assembleur pour ça !!
5 juin 2003 à 10:07
L'asm est donc justifié... Mais c'est vrai qu'en elle-même, cette boucle ne sert à rien, car on peut faire While True Do ...
5 juin 2003 à 09:28
Il suffit de soustraire à la variable de boucle 1 à chaque fois comme ça la variable de boucle n'augmente pas...