J'essayais de trouver comment calculer modulo 10 dans l'assemblage, donc j'ai compilé le code c suivant dans gcc pour voir ce qu'il a proposé.Comment fonctionne l'implémentation GCC de modulo (%), et pourquoi n'utilise-t-elle pas l'instruction div?
unsigned int i=999;
unsigned int j=i%10;
À ma grande surprise j'ai eu
movl -4(%ebp), %ecx
movl $-858993459, %edx
movl %ecx, %eax
mull %edx
shrl $3, %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
addl %eax, %eax
movl %ecx, %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, -12(%ebp)
Où -4 (% ebp) ou "i" est l'entrée et -12 (% ebp) ou "j" est la réponse. J'ai testé cela et cela fonctionne quel que soit le nombre que vous faites -4 (% ebp).
Ma question est de savoir comment ce code fonctionne et comment est-il préférable d'utiliser l'opérande div.
Connaissez-vous 32 bits? –
https://groups.google.com/forum/#!msg/comp.lang.asm.x86/BPkTrwLEgq8/_LbijZ5QD-cJ –
[Division entière par constantes] (http://blogs.msdn.com/b/ devdev/archive/2005/12/12/502980.aspx) –