Contenido>Indice>Intro CursoC51

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  

 


   Contenido>Indice>Intro CursoC51