Contenido>Indice>Intro CursoC51

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

 


   Contenido>Indice>Intro CursoC51