INICIALIZACIÓN DE PUNTEROS A XDATA EN TIEMPO DE EJECUCIÓN
Con frecuencia se necesita apuntar a direcciones en xdata, que solo son conocidas en tiempo de ejecución. En consecuencia, la asignación de valores a estos punteros debe hacerse cuando el programa está corriendo. Inicialmente, en tiempo de compilación, se define el puntero y no se le asigna ningún valor inicial. La asignación se realiza posteriormente, en tiempo de ejecución:
char xdata *cx_ptr ; /* Puntero a char en xdata sin inicializar */
main() {
cx_ptr = (char xdata*)0x8000 ; /*Apunta a dirección 0x8000 de xdata */
}
Otra posibilidad consiste en declarar un puntero a xdata y asignarle el valor de una variable. Veamos un ejemplo:
; char xdata *ptr ; /* Puntero a char en xdata */
;
; void main(void) {
main:
; char c1;
; int dir_inicio = 0x8000; /* Variable que contiene una dirección */
;---- Variable 'dir_inicio?041' assigned to Register 'R6/R7' ----
MOV R7,#00H
MOV R6,#080H
; ptr = (char *)dir_inicio ;
MOV ptr,R6
MOV ptr+01H,R7
?C0001:
; while(1)
; c1 = *ptr++ ;
INC ptr+01H
MOV A,ptr+01H
MOV R6,ptr
JNZ ?C0004
INC ptr
?C0004:
DEC A
MOV DPL,A
MOV DPH,R6
MOVX A,@DPTR
MOV c1?040,A
SJMP ?C0001
; }
RET
; END OF main
|
Una variación consiste en declarar un puntero a 0x0000 y utilizar una variable
como índice:
; char xdata *ptr ; /* Puntero a char en xdata */
;
;
; void main(void) {
main:
; unsigned char uc1, uc2;
; ptr = (char *) 0x0000 ;
CLR A
MOV ptr,A
MOV ptr+01H,A
; for(uc1 = 0; uc1 < 0x40 ; uc1++)
;---- Variable 'uc1?040' assigned to Register 'R7' ----
MOV R7,A
?C0001:
; uc2 = ptr[uc1] ;
MOV A,ptr+01H
ADD A,R7
MOV DPL,A
CLR A
ADDC A,ptr
MOV DPH,A
MOVX A,@DPTR
MOV uc2?041,A
INC R7
CJNE R7,#040H,?C0001
; }
?C0004:
RET
; END OF main
|