La mayoría de los chips dirigidos por XC8, si no todos, procesan un byte a la vez. Para asignar un valor de una variable de múltiples bytes a otra, tiene que cargar los primeros 8 bits de la fuente en WREG y almacenarlos en los primeros 8 bits del destino y luego hacerlo de nuevo con los siguientes 8 bits. En el nivel de ensamblaje, esto hace que sea trivial ajustar el endianness al mismo tiempo simplemente reordenando las instrucciones de carga o las instrucciones de la tienda (pero no ambas).
Pero parece que no puedo hacer que XC8 haga eso. He intentado varias combinaciones de desplazamiento por 8, o componentes, y máscaras, etc., y el código de ensamblaje más pequeño que puedo obtener proviene de una asignación directa seguida de un cambio xor:
union
{
unsigned int i;
struct
{
unsigned char lo;
unsigned char hi;
};
} address;
address.i = Packet->dest_addr;
address.hi ^= address.lo; //xor swap: valA ^ valB = diff (bitwise difference, not arithmetic)
address.lo ^= address.hi; //xor swap: valA ^ diff = valB
address.hi ^= address.lo; //xor swap: valB ^ diff = valA
Pienso que la fuente del puntero ayudaría o no haría ninguna diferencia, dependiendo de si se aprovechó de las instrucciones del inc / decrement del puntero, pero insiste en recalcular el puntero para cada byte excepto para una asignación directa como esta.
¿Me estoy perdiendo algo?
(Incluí la etiqueta de alta tecnología porque XC8 desciende de Hi-Tech después de que Microchip la compró. ¿Quizás haya un viejo truco que aún funcione?)