Hola, desconozco realmente assembler de un MicroChip con lo cual no puedo entender bien que hace el compilador. Lo que si fue probar en el CodeWarrior ( compilador oficial de FreeScale ) y el código generado es igual. Como nota particular fue ver lo elegante del codigo generado con una optimizacion que no conocia y habla de la calidad del compilador.
258: ( Data & 0x01 ) ? ( PTAD_PTAD1 = 1 ) : ( PTAD_PTAD1 = 0 );
0017 95 [2] TSX
0018 f6 [3] LDA ,X
0019 a501 [2] BIT #1
001b 2603 [3] BNE L20 ;abs = 0020
001d 1300 [5] BCLR 1,_PTAD
001f 65 [3] SKIP2 L22 ;abs = 0022
0020 L20:
0020 1200 [5] BSET 1,_PTAD
0022 L22:
259:
260: if ( Data & 0x01 )
0022 a501 [2] BIT #1
0024 2704 [3] BEQ L2A ;abs = 002a
261: {
262: PTAD_PTAD1 = 1;
0026 1200 [5] BSET 1,_PTAD
263: }
264: else
265: {
266: PTAD_PTAD1 = 0;
267: }
268: }
0028 8a [3] PULH
0029 81 [6] RTS
002a L2A:
002a 1300 [5] BCLR 1,_PTAD
002c 8a [3] PULH
002d 81 [6] RTS
La diferencias tienen que ver que estos dos condicionales estan al final de la funcion, si uno los invierte en el orden el código generado es similar. La optimizacion que les hablo es esta:
001d 1300 [5] BCLR 1,_PTAD
001f 65 [3] SKIP2 L22 ;abs = 0022
0020 L20:
0020 1200 [5] BSET 1,_PTAD
0022 L22:
Y trabaja asi, una vez que el port es apagado ( BLCR 1, PTAD ) Bit Clear 1 del Port A, se necesita saltar despues del ELSE del condicional, en vez de realizar un salto condicional ( BRA ) que consume 2 bytes, simplemente hace una comparacion del registro de 16 bits con una posicion de memoria, como esta instruccion consume 3 bytes me estoy ahorrando un byte. El 0x65 XX XX es justamente el OpCode de la instruccion CMPHX XXXX y XXXX son los dos bytes que consume el prendido del Port, obvio que el resultado de la comparacion es ignorado.
Estas son las cosas que me referia en algun post, que para mi la calidad de un entorno se ve en el código generado por el compilador, no si es mas bonito o no, si es mas facil de usar o no, si es Eclipse o no.
Saludos !
PD: Suky tu eres un experto es assembler de MicroChip, si eres tan amable podrias explicar que hace el compilador en el dissambler que posteaste ? Muchas gracias !