2010-05-10 41 views
7

(IA32), por ejemplo,prueba si un registro es igual a sí mismo en IA32

test $eax, $eax 

por qué querrías hacer eso? lo hace $eax & $eax, ¿verdad? ¿No debería este siempre establecer el registro de la bandera para decir que son iguales ..?

adición: así que la prueba establecerá la ZF (como se menciona a continuación) si el registro es cero. Entonces, ¿la prueba (como se usa arriba) principalmente se usa para decir si un registro está vacío? y ZF se establece si es así?

+0

posible duplicado de [x86 Ensamblaje - 'testl' eax contra eax?] (Http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax) –

Respuesta

9

Fijará ZF (el indicador de cero) si el registro es cero. Eso es probablemente lo que más comúnmente se utiliza para probar. También establecerá otras banderas apropiadamente, pero probablemente haya mucho menos uso para ellas.

Además, debo mencionar que test realmente no realiza una comparación - realiza una operación bit a bit and (descartando el resultado, excepto las banderas).

Para realizar una comparación de los operandos, se utilizará la instrucción cmp, que realiza una operación sub, descartando los resultados excepto las banderas. Tiene razón en que un

cmp $eax, $eax 

no tendría mucho sentido, ya que las banderas se establecerían según un resultado cero cada vez.

+0

por lo que se utiliza lo anterior conjunción con 'jne'. ¿'jne' mira la ZF? – sepiroth

+0

Sí - jne (salto no igual) está marcando la bandera cero condicionalmente para un salto. –

+1

Sí - 'jne' saltará si' ZF' no está configurado ('jne' es equivalente a' jnz' - ya que son el mismo código de operación). –

1

Esto está estableciendo el indicador de cero, de la misma manera que el uso de or $eax,$eax también puede probar no destructivamente el indicador de cero.

+0

Bah, demasiado lento en el sorteo ... –

1

Establece los indicadores Z y S en el procesador, por lo que puede decir después de "prueba eax, eax" (o cualquier otro registro 8, 16, 32 y creo que 64 bits) si el valor es cero o si el bit de signo está configurado, usando "je/jne/jz/jnz" o "js/jns" respectivamente. En 30 años de codificación para arquitecturas x80/​​x86, he hecho esto una gran cantidad de veces, con la mayoría de las combinaciones de registro. (¡No se usa esto en la práctica en ESP!)

IIRC, hay un bit de paridad que también se calcula, por lo que al hacer esta prueba puede determinar si el número de bits es impar o par, usando "jp/jnp". He nunca tenía un uso para esto.

1

Esta instrucción no está destinada a verificar solo si el valor de %eax es cero. Se puede usar como un todo para verificar si el valor %eax es cero o positivo o negativo. La mayor ventaja de usarlo de esta manera es que no modifica el valor de %eax (después de realizar %eax & %eax, simplemente descarta el valor) y establece los indicadores de condición de la siguiente manera.

si% eax el valor es cero, OF, CF, ZF = 0 (puesto a cero)
demás SF = MSB of the result (en este caso, es resultado %eax & %eax). Entonces, si el número es negativo, obtenemos SF = 1, de lo contrario SF = 0.

Cuestiones relacionadas