2011-11-20 164 views
6

De vez en cuando hay que analizar piezas de código ensamblador (IA32), y más que a menudo me encuentro con una instrucción que tiene este aspecto:XOR registro, registro (ensamblador)

xor ax, ax 

o con otros registros también: xor dx, dx, xor al, al, ...

¿Qué hace exactamente esto? (XOR hacha hacha siempre da 0?)

+0

duplicados de 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-and (xor es la mejor manera) –

Respuesta

13

Es un lenguaje ensamblador común para establecer un registro a 0.

xor ax, ax corresponde a ax = ax^ax que, como ya se avisos, es efectivamente ax = 0.

Si no recuerdo mal, la principal ventaja es que su código de tamaño es más pequeño que mov ax, 0

+0

Gracias, soy im agined tenía que ser algo diferente a establecerlo en 0, ya que usaría 'mov ax, 0' para eso, pero si produce un código de tamaño más corto, tiene más sentido. – Aerus

2

Eso es exactamente lo que hace - cero el contenido de un registro

1

xor% hacha, hacha%, como se dijo en comentarios anteriores, corresponde a ax = ax xor ax. Esto establece esencialmente ax = 0. Además, también afecta/modifica algunos de los EFLAGS como OF, CF, SF, PF o ZF. En este caso, se establecerán los indicadores PF y ZF.

SF - Indica si el resultado de la última operación dio como resultado un valor cuyo bit más significativo se pone a 1.

PF - Indica si el número de bits puestos es par o impar en la representación binaria de la resultado de la última operación.

ZF - Se establece si el resultado de la operación matemática/lógica es cero o se restablece de lo contrario.

El ejemplo se muestra a continuación utilizando fragmentos GDB.

Instrucción: xor% hacha, hacha%

Antes "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 

Después "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

Bienvenido a SO. Esta respuesta es más detallada de lo que es útil, IMO. No es necesario que explique cómo funcionan todas las banderas en respuesta a una pregunta sobre un modismo de puesta a cero. Sería suficiente dejar un comentario señalando que a diferencia de 'mov reg, 0', xor afecta las banderas. Dado que su respuesta hizo esta pregunta en la página principal de actividad reciente, terminé dejando un comentario a una pregunta con un enlace a una respuesta mucho más detallada sobre por qué xor es la mejor manera de cero regs. (Donde mencioné que en la mayoría de los casos, haga la puesta a cero antes de la instrucción cuyos resultados de bandera desea). –

+0

Gracias ... Acepto que tiene más detalles de los necesarios. Me doy cuenta ahora. – scanjee