tutorial registers lenguaje language instruction ensamblador assembly x86

assembly - registers - ¿Cuál es el propósito de XORing un registro consigo mismo?



lenguaje ensamblador x86 (7)

La operación XOR es realmente muy rápida. Si el resultado es establecer un registro en cero, el compilador a menudo lo hará de la manera más rápida que conozca. Una operación de bit como XOR puede tomar solo un ciclo de CPU, mientras que una copia (de un registro a otro) puede tomar un pequeño puñado.

A menudo, los escritores de compiladores incluso tendrán diferentes comportamientos teniendo en cuenta las diferentes arquitecturas de CPU de destino.

xor eax, eax siempre establecerá eax a cero, ¿verdad? Entonces, ¿por qué MSVC ++ a veces lo coloca en el código de mi ejecutable? ¿Es más eficiente que mov eax, 0 ?

012B1002 in al,dx 012B1003 push ecx int i = 5; 012B1004 mov dword ptr [i],5 return 0; 012B100B xor eax,eax

Además, ¿qué significa hacer in al, dx ?


Otra razón para usar XOR reg, reg o XORPS reg, reg es romper las cadenas de dependencia, esto permite que la CPU optimice la ejecución paralela de los comandos de ensamblaje de manera más eficiente (incluso si agrega más preformance de rendimiento de instrucción).


Sí, es más eficiente.

El opcode es más corto que mov eax, 0 , solo 2 bytes, y el procesador reconoce el caso especial y lo trata como un mov eax, 0 sin una dependencia de lectura falsa en eax , por lo que el tiempo de ejecución es el mismo.


También para evitar los 0 cuando se compilan como se usan en los códigos de shell para la explotación de desbordamientos de búfer, etc. ¿Por qué evitar el 0? Bueno, 0 representa el final de la cadena en c / c ++ y el código del shell se truncaría si la media de explotación es una función de procesamiento de cadenas o similar.

Por cierto me estoy refiriendo a la pregunta original: "¿Alguna razón para hacer un" xor eax, eax "?" no es lo que hace el compilador MSVC ++.

Dado que hay algo de debate en los comentarios sobre cómo esto es pertinente en el mundo real, consulte este artículo y esta sección en Wikipedia.


desde el OP> cualquier razón para hacer "xor eax, eax" devuelve 0; 012B100B xor eax, eax ret <- OP no muestra esto

El XOR EAX, EAX simplemente saca el registro EAX, se ejecuta más rápido que un MOX EAX, $ 0 y no necesita buscar datos inmediatos de 0 para cargar en eax

Es muy obvio que este es el "retorno 0" que MSVC está optimizando. EAX es el registro utilizado para devolver un valor de una función en MSVC.


xor se usa a menudo para encriptar un código, por ejemplo

mov eax,[ecx+ValueHere] xor eax,[ecx+ValueHere] mov [ebx+ValueHere],esi xor esi,[esp+ValueHere] pop edi mov [ebx+ValueHere],esi

La instrucción XOR conecta dos valores usando la exclusiva lógica O recuerda O usa inclusivo O Para comprender XOR mejor, considera esos dos valores binarios:

1001010110 0101001101

Si usted O ellos, el resultado es 1100011011 Cuando dos bits uno encima del otro son iguales, el bit resultante es 0. De lo contrario, el bit resultante es 1. Puede usar calc.exe para calcular XOR.


xor eax, eax es una forma más rápida de configurar eax a cero. Esto está sucediendo porque estás regresando cero.

La instrucción in está haciendo cosas con puertos de E / S. Básicamente, leer una palabra de datos del puerto especificado dx in y almacenarlo en al . No está claro por qué está sucediendo aquí. Aquí hay una reference que parece explicarlo en detalle.