2011-01-20 14 views
32

me estoy metiendo en el montaje y sigo corriendo en XOR, por ejemplo:¿Cuál es el significado de XOR en ensamblaje x86?

xor  ax, ax 

lo hace simplemente borrar el valor del registro?

+3

como un edulcorante, esto es ahora el * camino * preferido cero un registro en modernas micro-arquitecturas x86-64. No requiere ninguna unidad de ejecución (esencialmente manejada en el decodificador), elimina de manera efectiva las paradas (espera) en el registro dst = src, y rompe las marcas parciales al registrar puestos. –

+0

posible duplicado de [¿Alguna razón para hacer un "xor eax, eax"?] (Http://stackoverflow.com/questions/1396527/any-reason-to-do-a-xor-eax-eax) –

Respuesta

41

A XOR B en inglés se traduciría como "are A and B not equal". Por lo tanto, xor ax, ax establecerá ax en cero, ya que ax siempre es igual a sí mismo.

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

Esto es de mucha ayuda. Esta respuesta me ayudó en RE, así que por las dudas: Se traduciría algo así como 'if (A! = B)' en un lenguaje de alto nivel. – TheRookierLearner

+4

@TheRookierLearner: 'A XOR B' es un bloque de construcción primitivo para construcciones de alto nivel. * Se puede usar * para implementar '(A! = B)', pero es una operación claramente diferente en sí misma. Además, la afirmación de Nightcracker de que 'A XOR B' en inglés se traduzca como" son A y B no iguales "solo es correcta cuando se mira el resultado desde una perspectiva Booleana cero/distinta de cero. Una aplicación popular de XOR es alternar uno o más bits de un bitfield de entrada: el resultado de 'A XOR 1' es la inversión de solo el bit bajo de A. – phonetagger

+0

¡Muchas gracias por los otros usos también! – TheRookierLearner

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

La instrucción XOR realiza la operación anterior en cada par de bits en los dos operandos. Entonces 0xFF xor 0xFF sería 0x00 y 0x55 xor 0xAA sería 0xFF. Y sí, xor ax ax borra ax.

14

xor reg, reg se utiliza a menudo para borrar el registro. Puede ser una alternativa al mov reg, 0

AFAIR, en algunos casos fue más rápido (o más corto).

Y, por supuesto, XOR sí es exclusivo o (aka: disyunción exclusiva) operación (pero es una vergüenza para describir aquí estos conceptos básicos - utilizar Wikipedia)

5

xor register, register se utiliza comúnmente para 'cero' un registro, porque todos los bits se comparan entre sí:

0 bits permanecen en cero. 1-bits se convierten en cero, porque 1 XOR 1 es también 0.

1

Determina el O lógico exclusivo

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

Así, TRUE sólo si una de las expresiones es cierto, no ambos.

3

xor = exclusivo o. Vea la definición de wikipedia para Exclusive or.

Si tiene un registro consigo mismo, se pondrá a cero ese registro.

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

Tomemos el valor 41 como ejemplo (en binario):

101001 
xor 101001 
    = 000000 
2

En este caso se borrará el registro ... XOR es una "exclusiva o" ... por lo que si el hacha contiene 1010 y usted exclusivo o que con 1010 obtendrá 0000 (borrado)

1

Si no recuerdo mal hacha XOR, hacha es una instrucción de montaje de un byte, mientras mov ax, 0 habría por lo menos 3 y probablemente tardará un poco más en ejecutarse. Ciertamente llevará más tiempo decodificar que la instrucción xor.

+0

Depende del bittage, pero xor (e) ax, (e) ax es dos bytes. –

+0

@Jens: Claro, pero la pregunta es sobre ax, no eax! – Sean

+0

Si está en modo de 16 bits, la instrucción es de dos bytes. Si es de 32 bits, 3 bytes. –

7

xor ax, ax es la forma más rápida de configurar el registro de hachas en 0. Lo más rápido en términos de tamaño de instrucción y número de instrucciones. Para obtener detalles sobre cómo funciona, necesita un poco de conocimiento de la aritmética de bits.

operación XOR entre dos bits devuelve 1 si uno y solo uno de los dos bits es 1; 0 de lo contrario. Otra forma de explicar es que devuelve 1 si los dos bits son diferentes; 0 de lo contrario.

El funcionamiento XOR entre dos números binarios de la misma longitud funciona de forma bit a bit. XOR dos números obtienes un número con bits establecidos en 1 donde los bits correspondientes de los dos operandos difieren, 0 cuando los bits correspondientes son iguales.

partir de este conocimiento está bastante fácil ver que si los dos operandos son iguales (hacha y hacha por ejemplo) el resultado será 0.

+0

En el modo de 32 bits o de 64 bits, es más rápido ejecutar hacha cero con 'xor eax, eax'. Codificación más corta, y ninguna dependencia falsa en el valor anterior de la parte superior 16b. En el modo 16b en una CPU moderna, probablemente 'xor eax, eax' sea aún mejor, debido a los [muchos beneficios especiales de usar una expresión de ajuste a cero reconocida] (http://stackoverflow.com/questions/33666617/which-is- best-way-to-set-a-register-to-zero-in-x86-assembly-xor-mov-o-and/33668295 # 33668295) –

2

Cuando empecé a programar hace mucho tiempo no hubo exclusivo o ya sea en el procesador o en el compilador. Cuando llegó a hacerlo me quedé con las descripciones:

  • o: true si a = 1 ó b = 1 o ambos = 1
  • XOR: verdadero si a = 1 ó b = 1, pero no tanto = 1

así:

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

y

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

xor hacha, hacha se utiliza para establecer hacha a 0.

Motivo: instrucción típicamente xor en cualquier procesador toma menos bytes en el montaje, que el uso de movl 0,%ax

+6

Esto no parece agregar nada a las respuestas anteriores que mencionaban lo mismo cosa en más detalle. –

Cuestiones relacionadas