Langage d'assemblage - Comment faire Modulo?
2 réponses
L'instruction DIV
(et sa contrepartie IDIV
pour les nombres signés) donne à la fois le quotient et le reste (modulo). DIV r16
divise un nombre de 32 bits dans DX:AX
par un 16-bit opérande et stocke le quotient dans AX
et le reste dans DX
.
Exemple:
mov dx, 0
mov ax, 1234
mov bx, 10
div bx ; Divides 1234 by 10. DX = 4 and AX = 123
Dans l'assemblage 32 bits, vous pouvez faire div ebx
pour diviser un opérande 64 bits dans EDX:EAX
par EBX
. Pour plus d'informations, reportez-vous aux manuels du développeur de logiciels Intels Architectures.
Si vous calculez modulo une puissance de deux, en utilisant bit à bit et est plus simple et généralement plus rapide que d'effectuer la division. Si b
est une puissance de deux, a % b == a & (b - 1)
.
Par exemple, prenons une valeur dans le registre EAX, modulo 64.
Le moyen le plus simple serait AND EAX, 63
, car 63 est 111111 en binaire.
Les chiffres masqués et supérieurs ne nous intéressent pas. L'essayer!
Analogiquement, au lieu d'utiliser MUL ou DIV avec des pouvoirs de deux, bit-shifting est la voie à suivre. Méfier entiers signés, cependant!