Lenguaje ensamblador – ¿Cómo hacer Modulo?

¿Hay algo así como un módulo operador en x86 Assembler?

La instrucción DIV (y su contraparte IDIV para números con signo) da tanto el cociente como el rest (módulo). DIV r16 divide un número de 32 bits en DX:AX por un operando de 16 bits y almacena el cociente en AX y el rest en DX .

Ejemplo:

 mov dx, 0 mov ax, 1234 mov bx, 10 div bx ; Divides 1234 by 10. DX = 4 and AX = 123 

En el ensamblaje de 32 bits, puede hacer div ebx para dividir un operando de 64 bits en EDX:EAX por EBX . Consulte los manuales del desarrollador de software de Intels Architectures para obtener más información.

Si calcula el módulo una potencia de dos, usar AND a nivel de bit es más simple y generalmente más rápido que realizar la división. Si b es una potencia de dos, a % b == a & (b - 1) .

Por ejemplo, tomemos un valor en registrar EAX, módulo 64 .
La forma más simple sería AND EAX, 63 , porque 63 es 111111 en binario.

Los dígitos más altos y enmascarados no nos interesan. ¡Pruébalo!

De manera analógica, en lugar de usar MUL o DIV con potencias de dos, el cambio de bit es el camino a seguir. Sin embargo, ¡cuidado con los enteros firmados!