INICIALIZACIÓN DE PUNTEROS A XDATA EN TIEMPO DE COMPILACIÓN
En ocasiones se necesita un apuntador que en tiempo de compilación apunte a una dirección concreta, pero que permita, más adelante, apuntar a una dirección diferente. En estos casos no puede hacerse uso de las macros anteriores y se necesita recurrir a los punteros. La inicialización de los mismos se haría del siguiente modo:
char xdata *a_ptr = 0x8000; /* a_ptr es un puntero específico a char en xdata */ char *a_ptr = 0x028000L; /* a_ptr es ahora un puntero genérico a char */ char * xdata a_ptr = 0x028000L; /* puntero genérico a char, residente en xdata */
En los dos ejemplos anteriores el puntero señala inicialmente a la dirección 0x8000 de xdata. En el primer ejemplo, el puntero sólo puede apuntar a posiciones xdata. El puntero del segundo ejemplo puede apuntar a cualquier espacio de memoria. El valor "02", en el caso del puntero genérico le informa a C51 que debe apuntar a dirección xdata.
Los punteros son variables que contienen la dirección de otra variable. En los dos primeros ejemplos, los punteros mismos residen en el área correspondiente al modelo de memoria utilizado (data para el modelo SMALL). En el tercer ejemplo, el propio puntero reside en xdata, puesto que la palabra xdata se encuentra a la derecha del asterisco.
En el siguiente ejemplo ptr es un puntero a char en memoria xdata, y el propio puntero reside en xdata:
; char xdata * xdata ptr = 0x8000 ;
;
; main()
main:
; {
; char x ;
; ptr += 0xf0 ;
MOV DPTR,#ptr+01H
MOVX A,@DPTR
ADD A,#0F0H
MOVX @DPTR,A
MOV DPTR,#ptr
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
; x = *ptr ;
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV DPL,A
MOV DPH,R6
MOVX A,@DPTR
MOV x?040,A
; }
RET
; END OF main
|