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?
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?
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
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
@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
Molte grazie anche per gli altri usi! – TheRookierLearner
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
.
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)
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.
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.
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
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)
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.
Dipende da bittage, ma xor (e) ascia, (e) ascia è due byte. –
@Jens: Certo, ma la domanda riguarda l'ascia, non l'eax! – Sean
Se si è in modalità a 16 bit, l'istruzione è di due byte. Se 32 bit, 3 byte. –
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.
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) –
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:
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
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
Questo non sembra aggiungere nulla alle risposte precedenti che menzionavano lo stesso cosa in modo più dettagliato. –
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. –
possibile duplicato di [Qualche motivo per fare un "xor eax, eax"?] (Http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax) –