Bonjour,
je suis relativement nouveau en assembleur et j'ai grand plaisir à découvrir des trucs ou des conseils pour réduire le nombre de cycle processeur tout en ayant le même résultat. Je partage ce que j'ai trouvé en espérant apprendre d'avantage en échangeant ici. J'écris tous mes exemples en syntaxe AT&T 64bit puisque c'est la méthode la plus pertinente et la plus utilisée.
Voici les trucs ou conseils que j'ai trouvés qui sont tous simple mais non négligeable :
-1 Assigner zéro à un registre
La façon normal d'assigner demande de déplacer la valeur zéro dans un registre en utilisant l'instruction MOV. Cette méthode est lente puisque le processeur va chercher la valeur zéro en mémoire avant de l'écrire au registre. Le truc est d'utiliser l'instruction XOR sur un seul registre puisque un XOR sur une même valeur est toujours égal à zéro.
Méthode MOV: movq $0,%rax
Méthode XOR: xorq %rax,%rax
-2 Instruction LEA au lieu de MOV déréférencé
Lorsqu'on veut passer l'adresse mémoire d'une variable, il semble évident de simplement utiliser MOV sur une variable déréférencer. L'instruction LEA permet de faire la même chose sans avoir à passer par l'étape de déréférencement en copie l'adresse directement.
Méthode MOV: movq $variable,%rax
Méthode LEA: leaq variable,%rax
-3 Utilisation de la soustraction pour les boucles
Dans une boucle, on a un compteur qui est comparé à chaque itération à une valeur désirée. En utilisant un compteur partant d'un nombre positif qui descend jusqu'à zéro, on peut se servir de l'état du drapeau zéro lors de l'instruction SUB et ainsi éviter une comparaison inutile.
Méthode CMP:
1.add $1,%rcx
2.cmp valeur_désirée,%rcx
3.jnz début_boucle
Méthode SUB:
1. sub $1,%rcx
2. jnz début_boucle