Voilà un problème récurent et amusant dans ce qu'il révèle.
Souvent, pour des questions de nombre de doigts, l'humain aime à contempler le domaine numérique en base 10 plutôt qu'en tout autre base plus appropriée (si les jours duraient 32 heures de 64 minutes de 64 secondes, tout serait si paisible dans le bas monde des µp )
Nous avons déjà utilisé les "débordements" dans edx pour générer des itérations pseudo aléatoires (une liste suffisamment longue et homogène pour faire illusion dans de très nombreux cas), je vous propose de l'utiliser encore et toujours pour aller plus vite qu'une division.
Plus rapide que la division, nous avons la multiplication (pas idiv mais div). Ce n'est pas encore la panacée mais dans un algo devant traiter un nombre considérable de données, remplacer toutes les divisions par des multiplications fait la différence. Je n'aborde pas ici la version parallélisée SSEx, il faut bien que vous travailliez un peu, voir vous amuser dans "le pire" des cas .
La solution, simpliste, proposée fonctionne avec des nombres positifs de 0 à 999999999 compris. Au-delà, les nombres sont arrondis à l'excès avant de manifester une sérieuse propension aux effets de repliements (que nous avons utilisés dans la génération aléatoire).
Vous pouvez, une fois que vous maîtrisez le principe d'utilisation d'edx, diviser par à peu près tout est n'importe quoi sous certaines conditions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Mov ecx 0_1999_999A ; Initialisé une seule fois Mov eax 0~999999999 | mul ecx ;Là encore, le résultat est dans edx
Je reconnais que travailler dans plusieurs bases simultanément peu nuire à la santé (des "autres") mais c'est quand-même ce que l'on demande comme minimum à un codeur assembleur.
Regardez de plus près, toutes les commandes qui utilisent edx comme registre complémentaire avec cette idée derrière la tête et vous risquez à coup sûr de découvrir quelques trésors, propres à l'assembleur, qui le rende unique au niveau stratégique:
On ne le répétera jamais assez , porter un raisonnement HLL en assembleur est aussi stupide que le contraire ; les stratégies figées des uns et le dynamisme propositionel de l'autre sont totalement incompatibles dans leurs fondements mêmes.
Partager