El punto de prueba %eax %eax [duplicado]
Posible duplicado:
ensamblaje x86: ¿'testl' eax contra eax?
Soy muy nuevo en la programación en lenguaje ensamblador y actualmente estoy intentando leer el lenguaje ensamblador generado a partir de un binario. me he cruzado
test %eax,%eax
o test %rdi, %rdi
, etc., etc. Estoy muy confundido en cuanto a lo que hace esto. ¿ No son los valores %eax, %eax
los mismos? ¿Qué está probando? Leí en alguna parte que está realizando la AND
operación... pero como tienen el mismo valor, ¿no regresaría simplemente %eax
?
El siguiente es sólo un caso en el que encontré este uso:
400e6e: 85 c0 test %eax,%eax
400e70: 74 05 je 400e77 <phase_1+0x23>
Pensé que je
salta si los dos valores que se comparan son iguales... bueno, porque %eax
bueno, en sí, ¿en qué situación NO saltaríamos?
Soy principiante en programación en general, por lo que agradecería mucho que alguien pudiera explicarme esto. ¡Gracias!
CMP
resta los operandos y establece las banderas. Es decir, establece el indicador cero si la diferencia es cero (los operandos son iguales).
TEST
establece el indicador cero, ZF
cuando el resultado de la operación AND es cero. Si dos operandos son iguales, su AND bit a bit es cero cuando ambos son cero. TEST
también establece el indicador de signo, SF
cuando el bit más significativo se establece en el resultado, y el indicador de paridad, PF
cuando el número de bits establecidos es par.
JE
[Saltar si es igual] prueba la bandera cero y salta si la bandera está configurada. JE
es un alias de JZ
[Jump if Zero] por lo que el desensamblador no puede seleccionar uno según el código de operación. JE
se llama así porque el indicador cero se establece si los argumentos son CMP
iguales.
Entonces,
TEST %eax, %eax
JE 400e77 <phase_1+0x23>
salta si %eax
es cero.
Esto comprueba si EAX
es cero. La instrucción test
funciona bit a bit AND
entre los argumentos y, si EAX
contiene cero, el resultado establece ZF o ZeroFlag.
test
es no destructivo and
, no devuelve el resultado de la operación pero configura el registro de banderas en consecuencia. Para saber qué prueba realmente, debe consultar las siguientes instrucciones. A menudo, out se utiliza para comparar un registro con 0, posiblemente junto con un jz
salto condicional.
Tienes razón, ese test
"y" son los dos operandos. Pero el resultado se descarta, lo único que queda, y eso es lo importante, son las banderas. Están configurados y esa es la razón por la que test
se usa (y existe) la instrucción.
JE
no salta cuando es igual (tiene el significado cuando la instrucción anterior era una comparación), lo que realmente hace, salta cuando ZF
se establece la bandera. Y como es una de las banderas que establece test
, esta secuencia de instrucciones (prueba x,x; je...) tiene el significado de que se salta cuando x es 0.
Para preguntas como esta (y para más detalles), puedo recomendar un libro sobre instrucciones x86; por ejemplo, incluso cuando es muy grande, la documentación de Intel es muy buena y precisa.