Supongo que está hablando de los registros PORT en los PIC de pasatiempo común. Estos chips tienen un nivel de bits establecido e instrucciones claras, y se puede esperar que un compilador se traduzca
PortB.B0 = 1;
a
BSF PORTB, 0
PERO PERO PERO PERO PERO PERO PERO PERO
Este conjunto de bits y las instrucciones de borrado de bits se ejecutan como un ciclo completo de lectura-modificación-escritura de 8 bits. La CPU lee el puerto de 8 bits, borra el bit más bajo y vuelve a escribir el resultado. Esto solo sería de interés académico si no fuera por el hecho de que leer el PORTB lee los niveles lógicos en los pines de los chips. (En la mayoría de las otras arquitecturas, leería el registro de salida de PORTB). Cuando el pin se carga tan fuertemente que su nivel externo no lee el nivel donde el búfer de entrada lo reconoce correctamente, el valor leído puede diferir del último valor escrito eso. Este es el temido problema de lectura-modificación-escritura. La solución canónica es realizar las operaciones de bits en una ubicación de RAM (llamada la sombra del puerto) y luego escribir el búfer de sombra en el puerto mediante operaciones normales de 8 bits.
Si no usa este enfoque canónico, vivirá en momentos interesantes: al configurar un pin más en un puerto de salida, por ejemplo, puede borrar los pines que estableció anteriormente. Y, por supuesto, lo hará solo en una situación de producción, nunca en su banco de pruebas.
lado enote:
En el lenguaje Jal (que diseñé e implementé hace mucho tiempo, ahora es mantenido por otros) hay algo de magia de lenguaje y biblioteca para hacer
pin_a_5 = true
significa
port_a_shadow |= (1 << 5 )
port_a = port_a_shadow
Nota al margen 2:
Los PIC modernos tienen un registro LAT para cada puerto. La lectura de estos registros produce el último valor que se les escribió, por lo que no sufren el problema de lectura-modificación-escritura. AFAIK Jal en esos chips no se molesta en usar un registro sombra.