Pregunta

(ia32) por ejemplo,

test $eax, $eax

¿Por qué querrías hacer eso?lo hace $eax & $eax, ¿bien?¿No debería esto? siempre ¿Configurar el registro de banderas para que diga que son iguales...?

apéndice:entonces la prueba establecerá el ZF (como se menciona a continuación) si el registro es cero.Entonces, ¿la prueba (como se usó anteriormente) se usa principalmente para saber si un registro está vacío?¿Y ZF está configurado si es así?

¿Fue útil?

Solución

Se va fijado ZF (la bandera cero) si el registro es cero. Eso es probablemente lo que es más comúnmente utilizado para la prueba. Es también estableceremos otras banderas de manera apropiada, pero es probable que haya mucho menos uso de ellos.

Además, debo mencionar que en realidad no se test realizar una comparación -. Se lleva a cabo una operación en modo bit and (tirar el resultado, a excepción de las banderas)

Para realizar una comparación de los operandos, la instrucción cmp sería utilizado, que realiza una operación de sub, tirar los resultados con excepción de las banderas. Tiene razón en que a

cmp $eax, $eax

No tendría mucho sentido, ya que las banderas se establecen de acuerdo a un resultado de cero cada vez.

Otros consejos

Esto se estableciendo el indicador cero, de la misma manera que el uso de or $eax,$eax puede probar de forma no destructiva para la bandera cero también.

Establece los indicadores Z y S en el procesador, por lo que puedes saber 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 es set, 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 registros.(¡No usas esto en la práctica en ESP!)

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

Esta instrucción no está destinado a comprobar si el valor de %eax es cero. Puede ser en su conjunto utiliza para comprobar si el valor %eax es cero o positivo o negativo. La mayor ventaja de utilizar de esta manera es que no modifica el valle de %eax (después de realizar %eax & %eax, sólo los descartes de distancia del valor) y establece los indicadores de condición de la siguiente manera.

si el valor de% eax es cero, OF, CF, ZF = 0 (ajustado a cero)
SF = MSB of the result otra cosa (en este caso, es resultado %eax & %eax). Así que si el número es negativo, obtenemos SF = 1, de lo contrario SF = 0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top