Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Andres D en 28 de Agosto de 2010, 22:05:35
Título: Leer Dirección de Memoria de Programa
Publicado por: Andres D en 28 de Agosto de 2010, 22:05:35
Quisiera saber si hay alguna forma de obtener la dirección en memoria de programa de una etiqueta, para su uso con las directivas de MPLAB.
Se que se puede obtener la dirección mediante assembler, de la siguiente manera:
Código: ASM
ETIQUETA
;Codigo
;
;
movlw HIGH ETIQUETA
movwf VAR_01
movlw LOW ETIQUETA
movwf VAR_02
;Codigo
;
;
Pero lo que busco es ensamblar una sección de código en función de la dirección de la etiqueta, así:
Código: ASM
ETIQUETA
;Codigo
;
;
#IF ETIQUETA == H'0298'
nop
nop
#ENDIF
;Codigo
;
;
Esto último obviamente no funciona...
Alguna Idea???
Título: Re: Leer Dirección de Memoria de Programa
Publicado por: alogic.on en 29 de Agosto de 2010, 04:39:57
no se si te entiendo :? pero hallá va, si quieres poner una etiqueta en determinada direccion utiliza org por ej: org 0x800 ETIQUETA cada vez que uses etiqueta pondra la direccion 0x800 ahora que si lo que quieres es ver en que direccion de programa te esta poniendo ETIQUETA puedes mirarlo en la ventana view/program view (que alguien me corrija que no tengo el mplab delante) una vez compilas el programa en esta ventana se ve como queda el programa compilado en la memoria del micro con la direccion donde esta cada linea. espero haberme enterao, pá que esto te sirva
un saludo
Título: Re: Leer Dirección de Memoria de Programa
Publicado por: pablomanieri en 29 de Agosto de 2010, 10:59:05
He compilado un ejemplo para ver si la directiva del compilador IF puede leer la dirección de memoria de la etiqueta y si la toma. El problema es que debes saber en que lugar va a estar la etiqueta para saber con que valor comparar, en tu caso la etiqueta debes colocarla en 0x298, para que el if sea verdadero y en otro lugar para que sea falso. Lo que si tienes que tener en cuenta es que la etiqueta debe estar definida antes que ser usada en el IF, sino te va a dar error.
Código: ASM
org 0
goto inicio
org 5
inicio
org 0x298
ETIQUETA
;codigo
;
#IF ETIQUETA == H'298'
nop
nop
#ENDIF
end
También puedes hacer
#define variable ETIQUETA.
Con esto variable va a tener el valor de la dirección donde se encuentra ETIQUETA.
Como te dice alogic, si no le asignas un lugar del programa donde va a ir ETIQUETA, puedes verla en View/Program Memory. O con View/Disassemply Listing
Título: Re: Leer Dirección de Memoria de Programa
Publicado por: Andres D en 30 de Agosto de 2010, 05:44:30
Muchas gracias por tu excelente respuesta pablomanieri.
El problema es que la dirección de ETIQUETA varia cada vez que modifico el programa, ya sea para agregar o eliminar código antes de la tabla.
Les planteo un ejemplo:
Tengo Varias Tablas como esta, con diferentes valores:
Código: ASM
TABLA
PAGESELW $
movfw POINTER
addwf PCL,F
retlw 00H
retlw 01H
retlw 02H
retlw 03H
retlw 04H
retlw 05H
retlw 06H
retlw 07H
retlw 08H
retlw 09H
FIN_TABLA
Imaginense lo que pasa si TABLA está en la posicion h'02FA' (por ejemplo). El resultado es que el PC me va a saltar hacia otra sección del programa cuando debería saltar a la instrucción retlw 02H en adelante.
La idea es no tener que ubicar las tablas en posiciones específicas de la memoria de programa, sino crear un programa en base a directivas que me ajuste automaticamente la dirección de TABLA a h'0300' (para este caso), y usando la dirección de FIN_TABLA como referencia para definir si dicha TABLA sobrepasa la dirección h'02FF'
Espero haberme hecho entender.
Título: Re: Leer Dirección de Memoria de Programa
Publicado por: pablomanieri en 30 de Agosto de 2010, 09:18:10
No entiendo muy bien que es lo que intentas hacer. Soy medio duro. Si no especificas las direcciones donde van a ir las tablas, el compilador las acomoda automáticamente.
Título: Re: Leer Dirección de Memoria de Programa
Publicado por: Andres D en 30 de Agosto de 2010, 14:15:14
Te Coloco otro ejemplo, ahora un poco más gráfico:
Veamos que la parte enmarcada en rojo utiliza la intrucción PAGESELW para colocar el valor H'03' en el PCLATH. Al momento de sumar POINTER_LOW al PCL, el PCLATH deberia tener cargado el valor H'04' y NO H'03'.
Lo que busco es hacer un programa en base a directivas que lea la dirección de FIN_ETIQUETA y defina si es mayor a H'0400' (para este caso), para ajustar ETIQUETA automáticamente a esta dirección (H'0400') , y que rellene el espacio vacio con NOP, tal y como se ve en la segunda imagen (sección enmarcada en verde)