La verdad me ha costado un poco mas entender la alternativa de BrunoF...el registro F que mencionas es un registro auxiliar? Que valores toma? Lo que pasa es que revisando los ejemplos del set de instrucciones en el datasheet, el formato es <instruccion> f, d , donde "d" toma valores 0 o 1.
Precisamente "F" es un valor posible de "d". "d" es el destino. El destino puede adquirir dos valores posibles: 0 o 1. Si el destino es 0, entonces el resultado de la instrucción se guarda en W y el registro permanece inalterado. Si el destino es 1, el resultado de la instrucción se guarda en el regístro y W permanece inalterado. Poner "w", "W" o 0 es exáctamente lo mísmo. Poner "f", "F" o 1 es también lo mísmo. Entonces esa "F" significa que el resultado se guardará en el registro involucrado en la operación y W permanecerá con el ultimo valor cargado antes de la instrucción.
Ademas en el codigo...
movlw b'10000111'
andwf PORTB,F
call rotar_izquierda_3posiciones
iorwf PORTB,F
no me queda claro cómo se carga el valor 10000111 en el registro w, si cuando se llama a la subrutina, se debiera ingresar con el valor de los registros CENT, DEC y UNI.
Por favor si puedieran cometar e codigo para tener una mejor comprension. Gracias
movlw b'10000111' ;W ahora vale: b'10000111'
andwf PORTB,F ;Como el destino es F, luego de esta instrucción el PORTB valdrá b'X0000XXX'. Donde las X indican que dicho bit conservará el valor que tenía antes de la AND. Con esto se logra forzar bits a cero(Revisa la tabla de la verdad AND si tenés dudas...)
call rotar_izquierda_3posiciones es una subrutina que recibe el valor en W a rotar y lo devuelve cargado en W rotado.Acá cometí un error, ya que se me olvidó pasarle el valor a rotar...(sino rotaría el valor que tiene W en dicho momento que sería siempre b'10000111')
Entonces, lo correcto es, por ejemplo:
movf CENT,W ;copiar en W el valor de CENT
call rotar_izquierda_3posiciones ;rotar el valor
y finalmente:
iorwf PORTB,F
La IOR es una instrucción lógica cuyo comportamiento es el inverso de la AND. La IOR tiene la capacidad de poner bits a 1, pero jamás a 0. Por el contrario, la AND tiene la capacidad de poner bits a 0, pero jamás a 1.
Recordemos que antes que se ejecute la IOR, habíamos forzado los bits <6:3> del PORTB a cero.
Entonces, antes de la IOR, PORTB valdrá b'X0000XXX'.
Cuando se retorna de la subrutina de rotación, W tiene un valor b'0xxxx000'. Si te fijas, verás que aquí las x aparecen precisamente en los bits en los cuales el PORTB no las tiene.
Entonces comparandolos bit a bit tendríamos:
W = b'0xxxx000'
PORTB = b'X0000XXX'
Ahora, la IOR incluirá el valor de W en el del registro, que en este caso es el PORTB, quedando finalmente:
PORTB = b'XxxxxXXX' que es el resultado buscado.
¿Se entendió?
Saludos.