Langage d'assemblage - Comment faire Modulo?

Y a-t-il quelque chose comme un modulo-opérateur dans L'assembleur x86?

29
demandé sur starblue 2011-11-05 21:07:53

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.

56
répondu user786653 2014-07-30 04:41:28

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!

19
répondu Andreiasw 2017-07-07 10:31:22