2011-11-20 16 views
6

Di tanto in tanto dobbiamo analizzare pezzi di codice assembler (IA32), e più di spesso mi imbatto in un'istruzione che assomiglia a questo:registro XOR, registro (assemblatore)

xor ax, ax 

o con altri registri: xor dx, dx, xor al, al, ...

Che cosa fa esattamente questo? (Ax XOR ascia dà sempre 0?)

+0

duplicato di http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax – mark4o

+0

http://stackoverflow.com/questions/33666617/which-is-best-way-to-set-a-register-to-zero-in -x86-assembly-xor-mov-or-e (xor è il modo migliore) –

risposta

13

E 'un idioma comune assemblatore per impostare un registro a 0.

xor ax, ax corrisponde a ax = ax^ax che, come già le comunicazioni, è effettivamente ax = 0.

se ricordo bene il vantaggio principale è che il suo codice-dimensione sia inferiore mov ax, 0

+0

Grazie, io sono doveva essere qualcosa di diverso rispetto a impostarlo su 0 poiché userei 'mov ax, 0' per quello, ma se produce una dimensione del codice più corta ha davvero più senso. – Aerus

2

Questo è esattamente ciò che fa - azzerare il contenuto di un registro

1

xor% ax,% ax, come indicato nei commenti precedenti corrisponde ax = ax xor ax. Questo essenzialmente imposta ax = 0. Inoltre, influenza/modifica anche alcuni EFLAGS come OF, CF, SF, PF o ZF. In questo caso, verranno impostati i flag PF e ZF.

SF - Indica se il risultato dell'ultima operazione ha un valore il cui bit più significativo è impostato a 1.

PF - Indica se il numero di bit impostati è pari o dispari nella rappresentazione binaria della risultato dell'ultima operazione.

ZF - Viene impostato se il risultato dell'operazione matematica/logica è zero o non viene ripristinato diversamente.

L'esempio è illustrato di seguito utilizzando i frammenti GDB.

Instruction: xor% ax,% ax

Prima "xor"

(gdb) info registers 
eax   0xaa55 43605 
ecx   0x0 0 
edx   0x80 128 
ebx   0x0 0 
esp   0x6f20 0x6f20 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x7c02 0x7c02 
eflags   0x2 [ ] 
cs    0x0 0 
ss    0x0 0 
ds    0x0 0 
es    0x0 0 
fs    0x0 0 
gs    0x0 0 

Dopo "xor"

(gdb) info registers 
eax   0x0 0   --------------------> AX = 0   
ecx   0x0 0 
edx   0x80 128 
ebx   0x0 0 
esp   0x6f20 0x6f20 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x7c04 0x7c04 
eflags   0x46 [ PF ZF ] --------------------> Flags Set 
cs    0x0 0 
ss    0x0 0 
ds    0x0 0 
es    0x0 0 
fs    0x0 0 
gs    0x0 0 
+0

Benvenuti in SO. Questa risposta è più dettagliata di quanto sia utile, IMO. Non è necessario spiegare come funzionano tutte le bandiere in risposta a una domanda su un idioma di azzeramento. Basterebbe lasciare un commento sottolineando che a differenza di 'mov reg, 0', xor influenza le bandiere. Dal momento che la tua risposta ha inserito questa domanda nella prima pagina di attività recenti, ho finito per lasciare un commento a una domanda con un link a una risposta molto più dettagliata sul perché xor è il modo migliore per azzerare i reg. (Dove ho detto che nella maggior parte dei casi, fai l'azzeramento prima dell'istruzione di cui vuoi ottenere i risultati.) –

+0

Grazie .. Sono d'accordo che ha più dettagli del necessario. Me ne accorgo ora. – scanjee