Mi consulta es la siguiente cuando efectuo corrimiento en una variable y llego al bit mas significativo en el siguiente corimiento el bit se pierde, alguien me podria explicar porque sucede esto, la viariable es de 8 bits sin signo.
Esto por que el se escala primero a un resultado que pueda albergarlo todo y luego se recorta. Una explicacion simple seria:
uint8_t i,j;
i =1;
j = i << 8;
Eso seria igual a 512, la operacion de desplazar 8 veces a la izquierda supera los 8 bits entonces "promueve" a i a 16bits, pensale como que temporalmente se crea en memoria una variable de 16 bits que vamos a llamar temp y que va a alojar el resultado intermedio antes de pasarlo a i, entonces el valor de temp (o mejor dicho el valor de la operación hasta el momento) es:
temp es 0000 0001 0000 0000
Ahora ese resultado lo debe poner en uno de 8bits, por lo tanto se recorta y queda en 0000 0000 por eso mismo ves que los bits se pierden, y no hay equivalencia con el RRF y RLF de ASM.
Podes realizar un RLF o RRF sin carry haciendo lo mismo que voy a hacer con el SWAPF pero esta ves el corrimiento no es 4 en ambos, pero la suma es 8 por igual. No se que codigo generara el compilador en esta cirscuntancia.
La otra consulta es como puedo reemplazar la instruccion SWAPF para intercambio de nibles en XC8
La unica que vi es:
x = (x << 4) | (x >> 4);
Es decir uno pasa el nibble inferior al superior, los bits que restan se pierden y luego el otro pasa el nibble superior al inferior, dejando los bits de arriba en 0. Esto el compilador luego lo traduciria a un SWAPF (o deberia).