El punto de prueba %eax %eax [duplicado]

Resuelto pauliwago asked hace 12 años • 5 respuestas

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, %eaxlos mismos? ¿Qué está probando? Leí en alguna parte que está realizando la ANDoperació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 jesalta si los dos valores que se comparan son iguales... bueno, porque %eaxbueno, 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!

pauliwago avatar Oct 25 '12 15:10 pauliwago
Aceptado

CMPresta los operandos y establece las banderas. Es decir, establece el indicador cero si la diferencia es cero (los operandos son iguales).

TESTestablece el indicador cero, ZFcuando 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. TESTtambién establece el indicador de signo, SFcuando el bit más significativo se establece en el resultado, y el indicador de paridad, PFcuando el número de bits establecidos es par.

JE[Saltar si es igual] prueba la bandera cero y salta si la bandera está configurada. JEes un alias de JZ[Jump if Zero] por lo que el desensamblador no puede seleccionar uno según el código de operación. JEse llama así porque el indicador cero se establece si los argumentos son CMPiguales.

Entonces,

TEST %eax, %eax
JE   400e77 <phase_1+0x23>

salta si %eaxes cero.

John Dvorak avatar Oct 25 '2012 08:10 John Dvorak

Esto comprueba si EAXes cero. La instrucción testfunciona bit a bit ANDentre los argumentos y, si EAXcontiene cero, el resultado establece ZF o ZeroFlag.

ppeterka avatar Oct 25 '2012 08:10 ppeterka

testes 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 jzsalto condicional.

Jens Björnhager avatar Oct 25 '2012 08:10 Jens Björnhager

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 testse usa (y existe) la instrucción.

JEno salta cuando es igual (tiene el significado cuando la instrucción anterior era una comparación), lo que realmente hace, salta cuando ZFse 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.

flolo avatar Oct 25 '2012 08:10 flolo