2011-11-22 14 views
6

Sto imparando sulla divisione in linguaggio assembly. Secondo il libro da cui sto imparando, il risultato dell'operazione idiv è collocato in eax e il resto in edx.Come implementare l'operatore mod in assembly

Un esercizio nel libro è quello di attuare number = result % divisor in assemblea.

Avrei pensato che sarebbe stato equivalente a una normale operazione di divisione tranne edx sarebbe stato il risultato.

Questo non ha funzionato tuttavia ed edx restituito apparentemente immondizia.

Perché? Come hai implementato lo pseudo-codice sopra in assembly?

+4

Vorrei codificare una piccola funzione C e osservare l'assembly generato (ad esempio con 'gcc -O -fverbose-asm -S tiny.c') –

+2

La tua domanda è simile a http://stackoverflow.com/questions/8021772/assembly-language-how-to-do-modulo/8022107 Mostra il tuo codice effettivo se hai problemi specifici (molto probabilmente non stai cancellando la parte superiore superiore di rdx: rax, edx: eax o dx: ascia). – user786653

+0

Difficile da indovinare senza vedere il codice, ma un errore comune è dimenticare di zero edx prima dell'idiv. –

risposta

15

intero modulo può essere implementato in due modi:

In primo luogo utilizzando DIV o IDIV, dove il resto sarà messo in EDX, ma è necessario a zero EDX prima, o per citazione intel:

Dimensione operando ----------- | Dividendo | Divisore | Quoziente | Resto

Quadword/doppia parola | EDX: EAX | r/m32 | EAX | EDX.

esempio:

eax = eax % 9 

quando unsigned diventa:

XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder  
MOV ECX,9 
DIV ECX 
MOV EAX,EDX 

quando ha firmato, è:

MOV ECX,9 
CDQ ;this will clear EDX due to the sign extension 
IDIV ECX 
MOV EAX,EDX 

Il secondo modo è un'ottimizzazione utilizzato quando modulo utilizza una potenza di due, in questo caso si AND di o ne meno della potenza di due, ad esempio: eax = eax % 8 diventa AND EAX,7.

+0

Poiché idiv è la versione firmata, non dovresti CDQ in edx? – harold

+0

Ho provato a cancellare la mia domanda ma tu avevi già risposto. Voglio solo notare che potrebbe cambiare un bel po 'dopo aver aggiunto un esempio di codice. –

+0

@harold: si, ho dimenticato, buona cattura :) – Necrolis