Pregunta

Me estoy tomando un montaje supuesto, ahora, y el tipo que comprueba nuestras tareas en casa es un monstruo de la optimización de la vieja escuela muy pedante. Por ejemplo se descuenta el 10% si ve:

mov ax, 0

en lugar de:

xor ax,ax

incluso si sólo se usa una vez.

No soy un principiante en la programacion de montaje pero no soy un experto optimización, así que necesito su ayuda en algo (que podría ser una pregunta muy tonta pero voy a preguntar de todos modos): si necesito para establecer un valor de registro a 1 o (-1) es mejor usar:

mov ax, 1

o hacer algo como:

xor ax,ax
inc ax

Realmente necesito una calificación buena, así que estoy tratando de hacerlo tan optimizado como sea posible. (Necesito para optimizar tanto el tiempo como el tamaño del código)

¿Fue útil?

Solución

Una rápida de Google para 8086 instructions timings size se presentó http://8086.tk/ que parece tener todos los tiempos y tamaños para el 8086 (y más) conjuntos de instrucciones.

No hay duda de que podría encontrar mana oficial de Intel en la web con información similar.

Para su pregunta específica:

xor ax,ax
inc ax

toma 3 + 3 = 6 ciclos de reloj y 2 + 1 = 3 bytes mientras

mov ax,1

toma 4 ciclos de reloj y 3 bytes.

Así que el último es mejor en este caso.


Pero usted necesita hablar con su centro docente acerca de este tipo. 10% para una cosa tan simple como que los mendigos creencia.

Usted debe pedir que lo que debe hacerse en el caso de que usted tiene dos posibilidades, una rápida y otra más corta.

A continuación, una vez que han admitido que hay diferentes maneras de código dependiendo de lo que estamos tratando de lograr, les dicen que lo que estamos tratando de lograr es la legibilidad y mantenibilidad y en serio, no podría dar un salto de vuelo sobre un ciclo de desperdicio o byte aquí o allá * a .

La optimización es algo que por lo general lo hace, siempre y cuando se tiene un problema de rendimiento, después de una pieza de código se encuentra en un estado casi completo - es casi siempre un esfuerzo inútil cuando el código está todavía sujeta a un riesgo no despreciable de los cambios .

Por lo que vale, sub ax,ax parece estar a la par con xor ax,ax en términos de ciclos de reloj y bytes, por lo que tal vez usted podría lanzar que en la mezcla próxima vez que le causa algo más de trabajo.

* a) No, en realidad no, pero es divertido para ventilar de vez en cuando: -)

Otros consejos

Es mejor que con

mov AX, 1

en el 8086. Si eres contenidos de los registros de seguimiento, que posiblemente puede hacer mejor si sabe que, por ejemplo, BX ya tiene un 1 en la que:

MOV AX, BX

o si sabe que AH es 0:

mov AL, 1

etc.

Dependiendo de sus circunstancias, usted puede ser capaz de salirse con la suya ...

 sbb ax, ax

El resultado o bien será 0 si la bandera de acarreo no está establecida o -1 si se establece el indicador de acarreo.

Sin embargo, si el ejemplo anterior no es aplicable a su situación, yo recomendaría el

xor  ax, ax
inc  ax

método. Debe satisfacer su profesor para el tamaño. Sin embargo, si su procesador emplea cualquier tubería de revestimiento, que sería de esperar que haya alguna acoplamiento-como retardo entre las dos instrucciones (I muy bien podría estar equivocado en eso). Si existe un acoplamiento de este tipo, la velocidad se podría mejorar ligeramente reordenando sus instrucciones ligeramente para tener otra instrucción entre ellos (uno que no utiliza el hacha).

Espero que esto ayude.

Yo usaría mov [e]ax, 1 bajo ninguna circunstancia. Su codificación no más de la secuencia hackier xor es, y estoy bastante seguro de que es más rápido en cualquier lugar. 8086 es suficiente simplemente extraño a ser la excepción, y como cosa que es tan lento, un micro-optimización como esto haría que la mayoría diferencia. Pero en ninguna otra parte: la ejecución de instrucciones 2 "fáciles" siempre será más lenta que la ejecución 1, sobre todo si se tiene en cuenta los riesgos de datos y tuberías de gran longitud. Usted está tratando de leer un registro en la siguiente instrucción después de lo modifica, por lo menos que su lata CPU de derivación el resultado de la etapa N de la tubería (donde el xor está ejecutando) para poner en escena N-1 (donde el inc es tratando de carga el registro, no importa la adición de 1 a su valor), vas a tener puestos.

Otras cosas a considerar: el ancho de banda de captura de instrucciones (discutible para el código de 16 bits, ambos son 3 bytes); evita mov cambiantes banderas (más probable que sea útil de forzar a todos a cero); dependiendo de qué valores pueden contener otros registros, tal vez podría hacer lea ax,[bx+1] (también 3 bytes, incluso en código de 32 bits, ningún efecto sobre las banderas); como han dicho otros, sbb ax,ax podría funcionar también en circunstancias -. también es más corto en 2 bytes

Cuando se enfrentan a este tipo de micro-optimizaciones que realmente debería medida las alternativas en lugar de confiar ciegamente incluso en los manuales de procesador.

P.S. Nueva tarea: es más rápido que cualquier xor bx,bx xor bx,cx (en cualquier procesador)

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