2011-11-05 14 views

risposta

54

L'istruzione DIV (ed è la controparte IDIV per i numeri firmati) fornisce sia il quoziente che il resto (modulo). DIV r16 divide un numero a 32 bit in DX:AX da un operando a 16 bit e memorizza il quoziente in AX e il resto in DX.

Esempio:

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

In 32 bit assemblaggio si può fare div ebx per dividere un operando a 64 bit in EDX:EAX da EBX. Vedi Intels Architectures Software Developer’s Manuals per ulteriori informazioni.

+2

Ma GCC non utilizza div perché è lento: http://stackoverflow.com/questions/4361979/how-does- the-gcc-realizzazione-di-modulo-lavoro-e-perché-fa-da-non-uso-the –

13

Se si calcola modulo una potenza di due, l'uso di AND bit a bit è più semplice e generalmente più rapido rispetto alla divisione di esecuzione. Se b è una potenza di due, a % b == a & (b - 1).

Ad esempio, prendiamo un valore nel registro EAX, modulo 64.
Il modo più semplice sarebbe AND EAX, 63, perché 63 è 111111 in binario.

Le cifre mascherate e più alte non ci interessano. Provalo!

Analogamente, invece di utilizzare MUL o DIV con due potenze, lo spostamento dei bit è la strada da percorrere. Fate attenzione agli interi firmati, però!