2010-05-13 6 views
17

Estoy tomando un curso de asamblea ahora, y el chico que revisa nuestras asignaciones es un monstruo pedante de la optimización de la vieja escuela. Por ejemplo se descuenta el 10% si ve:La forma más eficiente de establecer Regístrese en 1 o (-1)

mov ax, 0 

en lugar de:

xor ax,ax 

incluso si sólo se usa una vez.

No soy un principiante en la programación de ensamblaje, pero no soy un experto en optimización, así que necesito su ayuda en algo (podría ser una pregunta muy estúpida, pero preguntaré de todos modos): si necesito configurar 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 buena calificación, por lo que estoy tratando de hacerlo lo más optimizado posible. (Necesito para optimizar tanto el tiempo como el tamaño del código)

+2

Utilizando la misma secuencia de instrucciones en cada ** ** contexto no le dará una velocidad óptima ** ** o tamaño. Para un ejemplo (de mierda), ¿qué ocurre si se garantiza que 'cx' será' 1' en el punto en el que debe establecer 'ax' a' 1'? Podrías simplemente 'mov ax, cx'. –

Respuesta

8

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

Sin duda podría encontrar el doco oficial de Intel en la web con información similar.

Para su pregunta específica:

xor ax,ax 
inc ax 

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

mov ax,1 

tarda de 4 ciclos de reloj y 3 bytes.

Por lo tanto, este último es mejor en ese caso.


Pero tiene que hablar con su instituto educativo acerca de este muchacho. 10% por una cosa tan simple como esa creencia de los mendigos.

Debe preguntar qué se debe hacer en el caso en que tenga dos posibilidades, una más rápida y otra más corta.

Luego, una vez que hayan admitido que hay diferentes maneras de codificar dependiendo de lo que intente lograr, dígales que lo que está tratando de lograr es legibilidad y mantenibilidad y seriamente no podría dar un vuelo salta sobre un ciclo perdido o un byte aquí o allá * a.

La optimización es algo que generalmente se hace siempre y cuando tenga un problema de rendimiento, después de que un fragmento de código está casi completo: casi siempre se desperdicia esfuerzo cuando el código sigue sujeto a una probabilidad no despreciable de cambio.

Por lo que vale la pena, 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, no realmente, pero es divertido para ventilar vez en cuando :-)

+0

gracias por la información, supongo que usaré la opción xor inc. – Bob

+0

No hay nada que no se pueda leer sobre 'mov ax, 1'. Tendría que pasar al siguiente nivel del codificador de asm para sentirse igualmente cómodo con 'xor, ax; inc hacha'. Hay niveles de legibilidad incluso en el montaje. Yo mismo, haría una macro 'set_1 ax' que acaba de traducir a la última, ganando tanto legibilidad _y_ velocidad/tamaño :-) – paxdiablo

+0

@Bob, lo siento amigo, cometí un error al omitir el costo en el' inc axe' - resulta que 'mov ax, 1' es realmente corto y más rápido (y más legible). – paxdiablo

2

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

sbb ax, ax 

el resultado será o bien 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, recomiendo el método

xor ax, ax 
inc ax 

. Debería satisfacer a tu profesor por el tamaño. Sin embargo, si su procesador emplea algún revestimiento de tubos, esperaría que haya un retraso similar a un acoplamiento entre las dos instrucciones (podría estar equivocado al respecto). Si existe tal acoplamiento, la velocidad podría mejorarse ligeramente reordenando ligeramente sus instrucciones para tener otra instrucción entre ellas (una que no use hacha).

Espero que esto ayude.

0

me gustaría utilizar mov [e]ax, 1 bajo ninguna circunstancia. Su codificación no es más larga que la secuencia de hackier xor, y estoy bastante seguro de que es más rápido en cualquier lugar. 8086 es lo suficientemente extraño como para ser la excepción, y como esa cosa es tan lenta, una micro-optimización como esta haría la mayor diferencia. Pero en cualquier otro lugar: la ejecución de 2 instrucciones "fáciles" siempre será más lenta que la ejecución 1, especialmente si se consideran los riesgos de datos y las tuberías largas. Está intentando leer un registro en la próxima instrucción después de modificarlo, a menos que su CPU pueda eludir el resultado de la etapa N de la canalización (donde se está ejecutando el xor) para pasar a la etapa N-1 (donde el inc. tratando de cargar el registro, no importa añadir 1 a su valor), va a tener puestos.

Otros aspectos a tener en cuenta: el ancho de banda de búsqueda de instrucciones (no coinciden los códigos de 16 bits, ambos son 3 bytes); mov evita cambiar indicadores (es más probable que sea útil que forzarlos a cero); dependiendo de qué valores puedan contener otros registros, quizás podría hacer lea ax,[bx+1] (también 3 bytes, incluso en código de 32 bits, sin efecto en indicadores); como otros han dicho, sbb ax,ax también podría funcionar en circunstancias, también es más corto a 2 bytes.

Ante este tipo de micro-optimizaciones, realmente debe medir las alternativas en lugar de confiar ciegamente incluso en los manuales del procesador.

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

+2

A su pregunta de PS: Sí, lo es. En los procesadores modernos, una instrucción xor en dos registros idénticos obtiene un tratamiento especial por parte de la CPU, lo que hace que no tenga una dependencia falsa del valor anterior del registro, que es más rápido y reduce el número de registros internos que la CPU necesita usar. Algunos procesadores no tienen esta comprobación para la instrucción secundaria, por lo que es preferible xor aquí. – fuz

3

Es mejor que con

MOV AX, 1

en el 8086.Si realiza el seguimiento contenido de los registros, 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.

Cuestiones relacionadas