2011-11-05 32 views

Respuesta

54

La instrucción DIV (y es la contraparte IDIV para números con signo) proporciona tanto el cociente como el resto (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 resto en DX.

Ejemplo:

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

En 32-bit de montaje se puede hacer div ebx para dividir un operando de 64 bits en EDX:EAX por EBX. Consulte Intels Architectures Software Developer’s Manuals para obtener más información.

+2

Pero GCC no usa div porque es lento: http://stackoverflow.com/questions/4361979/how-does- the-gcc-implementation-of-module-work-and-why-does-it-not-use-the –

13

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 el registro EAX, módulo 64.
La manera 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!

Analógicamente, 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!

Cuestiones relacionadas