2011-01-20 14 views
32

Sto sempre in assemblaggio e continuo a correre in XOR, ad esempio:Qual è il significato di XOR nell'assemblaggio x86?

xor  ax, ax 

vuol semplicemente cancellare il valore del registro?

+3

come dolcificante, questo è ora il preferito * * senso azzerare un registro sulle moderne micro-architetture x86-64. Non richiede alcuna unità di esecuzione (essenzialmente gestita nel decodificatore), elimina efficacemente gli stalli (in attesa) sul registro dst = src e interrompe i blocchi di registro delle bandierine parziali. –

+0

possibile duplicato di [Qualche motivo per fare un "xor eax, eax"?] (Http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax) –

risposta

41

A XOR B in inglese sarebbe tradotto come "sono A e B non uguale". Quindi xor ax, ax imposta zero a ax poiché ax è sempre uguale a se stesso.

A B | A XOR B 
0 0 | 0 
1 0 | 1 
0 1 | 1 
1 1 | 0 
+0

Questo è davvero utile Questa risposta mi ha aiutato in RE, quindi per ogni evenienza: Si tradurrebbe in qualcosa come "if (A! = B)" in un linguaggio di alto livello. – TheRookierLearner

+4

@TheRookierLearner: 'A XOR B' è un elemento di base per i costrutti di livello superiore. Può * essere usato * per implementare '(A! = B)', ma è un'operazione nettamente diversa a sé stante. Inoltre, l'affermazione di Nightcracker che "A XOR B" in inglese verrebbe tradotta come "sono A e B non uguali" è corretta solo quando si guarda il risultato da una prospettiva booleana zero/non zero. Una popolare applicazione di XOR è di attivare uno o più bit di un bitfield di input: il risultato di 'A XOR 1' è l'inversione del solo bit basso di A. – phonetagger

+0

Molte grazie anche per gli altri usi! – TheRookierLearner

3
A B | XOR 
0 0 | 0 
1 0 | 1 
0 1 | 1 
1 1 | 0 

L'istruzione XOR esegue l'operazione sopra riportata su ogni coppia di bit nei due operandi. Quindi 0xFF xor 0xFF sarebbe 0x00 e 0x55 xor 0xAA sarebbe 0xFF. E sì, xor ax ax cancella ax.

14

xor reg, reg viene spesso utilizzato per cancellare il registro. Può essere un'alternativa a mov reg, 0

AFAIR, in alcuni casi era più veloce (o più breve).

E, naturalmente, XOR è di per sé esclusivo o (aka: disgiunzione esclusiva) operazione (ma è un peccato per descrivere qui queste basi - utilizzare Wikipedia)

5

xor register, register è comunemente usato a 'zero' un registro, in quanto tutti i bit vengono confrontati tra loro:

0 bit rimangono zero. 1 bit diventano zero, perché 1 XOR 1 è 0.

1

Si determina il logico esclusivo

0 XOR 0 = 0 
0 XOR 1 = 1 
1 XOR 0 = 1 
1 XOR 1 = 0 

Quindi, vero solo se una delle espressioni è vero, non entrambi.

3

xor = esclusivo o. Vedi la definizione di wikipedia per Exclusive or.

Se si registra un registro con se stesso, verrà annullato tale registro.

0 xor 0 = 0 
0 xor 1 = 1 
1 xor 0 = 1 
1 xor 1 = 0 

Prendiamo il valore 41 come esempio (in binario):

101001 
xor 101001 
    = 000000 
2

In questo caso sarà chiaro registro ... XOR è un "esclusivo o" ... quindi se ax contiene 1010 e tu esclusivo o quello con 1010 riceverai 0000 (cancellato)

1

Se non ricordo male XOR ascia, ascia è un'istruzioni di montaggio di un byte, mentre mov ax, 0 sarebbero almeno 3 e sarebbe probabilmente prendere un po 'più tempo per eseguire. Ci vorrà sicuramente più tempo per decodificare rispetto all'istruzione xor.

+0

Dipende da bittage, ma xor (e) ascia, (e) ascia è due byte. –

+0

@Jens: Certo, ma la domanda riguarda l'ascia, non l'eax! – Sean

+0

Se si è in modalità a 16 bit, l'istruzione è di due byte. Se 32 bit, 3 byte. –

7

xor ax, ax è il modo più veloce possibile impostare il registro ascia per 0. Il più veloce in termini di dimensioni dell'istruzione e numero di istruzioni. Per i dettagli su come funziona hai bisogno di una piccola conoscenza del bit aritmetico.

XOR l'operazione tra due bit restituisce 1 se uno e uno solo dei due bit è 1; 0 altrimenti. Un altro modo per spiegare è che restituisce 1 se i due bit sono diversi; 0 altrimenti.

L'operazione XOR tra due numeri binari della stessa lunghezza funziona anche su base bit per bit. XOR due numeri ottieni un numero con bit impostati a 1 dove i bit corrispondenti dei due operandi differiscono, 0 quando i bit corrispondenti sono uguali.

Da questa conoscenza la sua abbastanza facile vedere che se i due operandi sono gli stessi (ascia e ascia per esempio) il risultato sarà 0.

+0

In modalità 32 bit o 64 bit, è più veloce azzerare l'ascia con 'xor eax, eax'. Codifica più breve e nessuna dipendenza falsa sul valore precedente del 16b superiore. In modalità 16b su una CPU moderna, probabilmente 'xor eax, eax' è ancora meglio, a causa dei [molti vantaggi speciali dell'uso di un idioma di azzeramento riconosciuto] (http://stackoverflow.com/questions/33666617/which-is- best-way-to-set-a-register-to-zero-in-x86-assembly-xor-mov-or-e/33668295 # 33668295) –

2

Quando ho iniziato la programmazione molto tempo fa non vi era alcuna esclusiva o sul processore o nel compilatore. Quando ho ottenuto intorno ad esso ho attaccato alle descrizioni:

  • o: vero se a = 1 oppure b = 1 o entrambi = 1
  • XOR: vero se a = 1 oppure b = 1, ma non entrambi = 1

così:

0 or 0 = 0 
0 or 1 = 1 
1 or 0 = 1 
1 or 1 = 1 

e

0 xor 0 = 0 
0 xor 1 = 1 
1 xor 0 = 1 
1 xor 1 = 0 
1

xor ax, scure è utilizzato per impostare ax 0.

Motivo: istruzioni tipicamente xor su qualsiasi processore richiede meno byte nel montaggio, che usare movl 0,%ax

+6

Questo non sembra aggiungere nulla alle risposte precedenti che menzionavano lo stesso cosa in modo più dettagliato. –