Efectivamente, es como describiste la teoria pero no se invierte todo el puerto.
Ejemplo:
Antes de la instruccion:
PORTB = b'10101010'
al hacer:
movlw b'00010000'
xorwf PORTB,F
la XOR hace esto:
10101010
XOR
00010000
-------------------------
10111010
Como podes ver, solo camabio el RB4 de estado.
Esto es asi cuando controlamos uno de los dos registros en juego. Pensemos que las instrucciones logicas se realizan, la mayoria de las veces, entre dos registros distintos(y no sobre un mismo registro).
Te paso una tabla de verdades que por ahi son mas utiles que las que tenes:
XOR:
Muy util para invertir bits o comparar valores iguales (A = B <-> A XOR B = 0).
Supongamos que tengo un registro MiReg= b'????????'
Si quiero invertir el valor de un pin de MiReg, harè una XOR con el bit correspondiente seteado a 1. Al resto de bits que no quiera invertir, los haré valer 0.
Ejemplo:
Quiero invertir el bit 1 de MiReg.
Independientemente de lo que valga MiReg, siguiendo la ley anterior, haré:
movlw b'00000010'
xorwf MiReg,F
Despues de las instrucciones:
MiReg= b'??????¿?'
Donde ¿ es el estado inverso al que tenia antes de someter a MiReg a la XOR.
AND
Fuerza bits a valer cero.
Supongamos que tengo un registro MiReg= b'????????'
Si quiero forzar un/os bit/s de MiReg a valer 0, harè una AND con dicho/s bit/s en 0 . Al resto de bits que no quiera forzar a 0(conservaran su estado anterior) los haré valer 1.
Ejemplo:
Quiero forzar a cero todo el nibble bajo de MiReg.
Independientemente de lo que valga MiReg, siguiendo la ley anterior, haré:
movlw b'11110000'
andwf MiReg,F
Despues de las instrucciones:
MiReg= b'????0000'
Otras conclusiones adicionales:
C = A AND B
C nunca puede valer más que lo que vale A o más que B. Puede valer menos que ambos, o bien igual a uno de ellos(o a ambos).
Conclusion: El resultado es siempre menor o a lo sumo igual al menor de los registros en juego.
IOR
Fuerza bits a valer uno.
Supongamos que tengo un registro MiReg= b'????????'
Si quiero forzar un/os bit/s de MiReg a valer 1, harè una IOR con dicho/s bit/s en 1 . Al resto de bits que no quiera forzar a 1(conservaran su estado anterior) los haré valer 0.
Ejemplo:
Quiero forzar a uno todo el nibble alto de MiReg.
Independientemente de lo que valga MiReg, siguiendo la ley anterior, haré:
movlw b'11110000'
iorwf MiReg,F
Despues de las instrucciones:
MiReg= b'1111????'
Otras conclusiones adicionales:
C = A IOR B
C nunca puede valer menos que lo que vale A o menos que B. Puede valer más que ambos, o bien igual a uno de ellos(o a ambos).
Conclusion: El resultado es siempre mayor o por lo menos igual al mayor de los registros en juego.
¿Sirvió de ayuda?
Si mi tabla de la verdad falla en algo me avisan...
Ejercicios(haganlos a quienes les intereza el potencial de las operaciones logicas):
¿Qué hace ((A IOR B) XOR A)? ¿Y ((A IOR B) XOR B)?
Saludos!