Este hilo también podía haberse llamado "
Añadiendo código para optimizar".
Lo que pretendo compartir con vosotros es algo que he observado en mis programas en C, e imagino que muchos de vosotros también lo ha visto.
He adquirido la costumbre de revisar el código ASM que generan mis programas una vez compilados y cuando veo algo que me sorprende por su tamaño, intento mejorarlo.
Así, en ocasiones he observado como a veces un
código más largo o complejo en C, genera paradójicamente un
código más compacto, corto y rápido en ASM.
Os dejo por aquí un ejemplo, y me comprometo a ir posteando los que me vaya encontrando a lo largo del camino por si sirve de ilustración.
Observad este trocito de código, que compara una Variable de 16 bits con una constante:
if (Variable>0x0A00)
Variable=0;Pues bien, al compilarlo genera un ASM de 12 CICLOS:
.................... if (Variable>0x0A00)
0047: BCF 03.5
0048: MOVF 22,W
0049: SUBLW 09
004A: BTFSC 03.0
004B: GOTO 055
004C: XORLW FF
004D: BTFSS 03.2
004E: GOTO 053
004F: MOVF 21,W
0050: SUBLW 00
0051: BTFSC 03.0
0052: GOTO 055
Puestos a probar otras alternativas, lo modifiqué así:
if ((Variable>>8)>0x0A)
Variable=0;Y el código generado se redujo en dos ciclos:
.................... if ((Variable>>8)>0x0A)
005B: MOVF 22,W
005C: MOVWF 23
005D: CLRF 24
005E: MOVF 24,F
005F: BTFSS 03.2
0060: GOTO 065
0061: MOVF 23,W
0062: SUBLW 0A
0063: BTFSC 03.0
0064: GOTO 067
Mi grata sorpresa vino cuando compilé esta tercera versión del código:
if (make8(Variable,1)>0x0A)
Variable=0;Con esta última version, obviamente más larga y compleja que la primera, el código ASM se quedó en
4 CICLOS:
.................... if (make8(Variable,1)>0x0A)
0055: MOVF 22,W
0056: SUBLW 0A
0057: BTFSC 03.0
0058: GOTO 05B
Os recomiendo reviséis el ASM porque, sobre todo en micros pequeñitos, podemos ganar bastante haciendo ligeros cambios en nuestros programas.