Direccionamiento de la memoria de datos (RAM)
La memoria interna se direcciona en forma directa por medio
de los 5 bits “f” contenidos en las instrucciones que operan sobre registros.
De esta manera se puede direccionar cualquier posición desde la
00 a la 1F. Como se vió en el capítulo correspondiente a
los mapas de memoria, las direcciones 10 a 1F corresponden a los bancos
de registros, por lo tanto, en los microcontroladores que tengan más
de un banco, antes de acceder a alguna variable que se encuentre en esta
zona, el programador deberá asegurarse de haber programado los bits
de selección de banco en el registro FSR.
Ejemplo :
; Esta porción de programa borra 5 posiciones de memoria a partir de la dirección 12
FSR equ 04
;(definición al comienzo del programa)
.....................................
.....................................
movlw
5
;prepara para repetir 5 veces
movwf 08
;(el registro 08 es el contador del loop)
movlw 12h
;apunta a la dirección 12h
movwf FSR ;
loop:
clrf 0
;borra una posición de memoria
incf FSR
;apunta a la siguiente
decfsz 08
;si todavía no borra todas
goto loop
;sige borrando
.....................................
.....................................
El direccionamiento indirecto es muy útil para el procesamiento
de posiciones consecutivas de memoria, como en el ejemplo, o para el direccionamiento
de datos en subrutinas.
Direccionamiento de la memoria de programa (EPROM, OTP)
La instrucción GOTO dispone solo de 9 bits en el código
de operación para especificar la dirección de destino del
salto. Al ejecutar una instrucción GOTO el microprocesador toma
los dos bits que restan para completar la dirección de 11 bits,
de los bits 5 y 6 de la palabra de estado. Estos últimos son llamados
bits de selección de página (PA0 y PA1). El programador deberá
asegurarse de que estos dos bits tengan el valor correcto antes de toda
instrucción GOTO. Ver figura 2.2.1
Deberá tenerse en cuenta además que es posible avanzar de una página a otra en forma automática cuando el PC se incrementa. Esto ocurre si el programa empieza en una página y sigue en la siguiente. Sin embargo, al incrementarse el PC desde la última posición de una página a la primera de la siguiente, los bits PA0 y PA1 no se modifican, y por lo tanto sí se ejecuta una instrucción GOTO, CALL o alguna que actúe sobre el PC, esta producirá un salto a la página anterior, a menos que el programador tenga la precaución de actualizar el valor de dichos bits. Por este motivo es conveniente dividir el programa en módulos o rutinas que estén confinados a una página.
En el caso de la instrucción CALL, el direccionamiento se complica
un poco más, ya que la misma solo dispone de 8 bits para especificar
la dirección de destino salto. En este caso también se utilizan
los mismos bits de selección de página para completar los
bits décimo y decimoprimero de la dirección, pero falta el
noveno bit. En estas instrucciones este bit se carga siempre con 0, lo
que implica que solo se pueden realizar saltos a subrutina a las mitades
inferiores de cada página. En este caso también el programador
deberá asegurarse que el estado de los bits PA0 y PA1 sea el correcto
al momento de ejecutarse la instrucción. Ver figura 2.2.2
Las instrucciones que operan sobre el PC como registro y alteran su contenido provocando un salto, responden a un mecanismo muy similar al de las instrucciones CALL para la formación de la dirección de destino. En este caso los bits 0 a 7 son el resultado de la instrucción, el bit 8 es 0 y los bits restantes se toman de PA0 y PA1.
Este mecanismo se llama paginado, y a pesar de que representa una complicación bastante molesta para el programador, resulta muy útil ya que permite ampliar la capacidad de direccionamiento de memoria de programa para las instrucciones de salto.