Yop,
en TP de C, j'ai été ammené à écrire un code qui faisait apparaître une situation dans laquelle j'ai choisi de faire une suite de divisions / additions pour obtenir le résultat. Le chargé de TP m'a dit que le plus rapide et logique aurait été de faire un modulo, je lui ai demandé en détail comment était implémenté le modulo pour qu'il soit plus rapide que la division entière et j'ai pas eu de réponse.
Je me rappelle pas avoir vu d'instruction modulo en assembleur.. donc j'ai cherché et effectivement ce que je trouve semble confirmer ce que je pensais.. du coup pour avoir le coeur net j'ai essayé le code suivant :
for(i=1;i<16;i++) {
a = 27 % i;
}
avec a, et i unsigned pour pas avoir de problème de signe dans les opérations asm résultantes et j'obtiens ça en sortie de gcc sans optimisation :
movl $27, %eax // eax = 27
movl $0, %edx // edx = 0
divl -4(%rbp) // divise (quoi ?) par i
movl %edx, -8(%rbp) // a = edx
addl $1, -4(%rbp) // i++
Donc il semblerait que le modulo soit simplement implémenté par une division entière.
Maintenant les questions : divl -4(%rbp) l'instruction a qu'une opérande.. qu'est-ce qui est divisé par celle-ci (enfin comment sont gérés les registres avec div) ? Pourquoi est-ce que edx est mis à 0 ? Finalement est-ce vrai que le modulo est plus rapide que le div et une soustraction ? je dirais oui étant donné que div est implémentée de telle manière que le reste soit stocké dans edx même si la différence est d'une opération (sub) et que ça joue rien du tout au final. 