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 |