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 |