2009-11-18 44 views
6

¿Cuál es la diferencia entre las instrucciones de montaje LOOP, LOOPE y LOOPNE?LOOP, LOOPE, LOOPNE?

+2

No utilice estas instrucciones; son muy lentos en las CPU modernas. En su lugar, use la ramificación a mano. –

+1

@Alex Strange: ¿tiene alguna evidencia para respaldar su declaración? Gracias. – Timotei

+1

@Timotei Dolean: Consulte las tablas de instrucciones en http://agner.org/optimize/. Un libro de texto de CPU que discute la microcodificación (y con suerte algunos lo hacen) explicará el razonamiento. –

Respuesta

15

LOOP disminuye ecx y comprueba si ecx no es cero; si se cumple esta condición, salta en la etiqueta especificada, de lo contrario no se cumple.

LOOPE disminuye ecx y comprueba que ecx no es cero y ZF está configurado; si se cumplen estas condiciones, salta en la etiqueta; de lo contrario, no se aplica.

LOOPNE es lo mismo que LOOPE excepto que requiere que ZF no esté configurado (es decir, que sea cero) para hacer el salto.

+8

También no solicitado Me gustaría señalar que todas las instrucciones de LOOP son mucho más lentas que la contraparte DEC ECX/JNZ. Esto está pensado ya que LOOP debería usarse en la actualidad solo para bucles de calibración de retardo utilizados para controladores de hardware y similares. –

+0

@NilsPipenbrinck: ¿En qué procesadores es más lento? ¿Cuál es tu fuente? –

+1

@JanusTroelsen, es más lento desde el 80486 en adelante. En los últimos procesadores es ** mucho ** más lento. Fuente: http://www.agner.org/optimize/ manual # 2. – Johan

4

Tiempo para un Google Books Reference

EDIT: Sinopsis de enlace: LOOPE y LOOPNE son esencialmente las instrucciones de bucle con una comprobación adicional. LOOPE bucles "while zero flag", lo que significa que se repetirá siempre que cero flag ZF sea uno y no se alcance el incremento, y LOOPNE bucles "while not zero flag", lo que significa que continúa el bucle siempre que ZF sea cero y el no se alcanza el incremento Tenga en cuenta que ninguna de estas instrucciones afecta inherentemente el estado de ZF.

+1

Creo que es mejor no solo proporcionar un enlace, sino citar material relevante de la fuente, en caso de que el enlace se vuelva inválido. –

2

Las instrucciones LOOP, así como JCXZ/JECXZ son un poco lentas; sin embargo, todavía tienen su lugar en el código moderno.

La alta velocidad no siempre es una preocupación en los bucles. Por ejemplo, si estamos ejecutando un ciclo solo una vez durante el inicio del programa y el recuento de iteraciones es pequeño, el tiempo requerido no se notará.

Otro ejemplo es un bucle donde se llaman las funciones API de Windows; el tiempo pasado en la llamada API probablemente hace que el tiempo de ejecución de LOOP sea trivial. Nuevamente, esto se aplica cuando el recuento de iteraciones es pequeño.

Considere estas instrucciones como "otra herramienta en su caja de herramientas"; utilice la herramienta adecuada para el trabajo;)