PUNTEROS ESPECÍFICOS EN C51
Como ya se ha comentado, los punteros específicos apuntan a objetos residentes en tipos concretos de memoria. Para su almacenamiento requieren: 1 byte (punteros a idata, data y pdata), o 2 bytes (punteros a xdata y code). Los punteros específicos son muy eficientes y reducen el tamaño de código empleado por el compilador. Un puntero específico a char residente en xdata se define así:
char xdata *ext_ptr ;
y un puntero a char en code, de esta forma:
char code *const_ptr ;
En ambos casos, los punteros se almacenan en el área de memoria correspondiente al modelo de memoria utilizado (SMALL en data, COMPACT en pdata, LARGE en xdata). Si se desea crear un puntero a char en xdata, pero que el propio puntero resida en pdata, la declaración debe ser:
char xdata * pdata ext_ptr ;
En el siguiente ejemplo, al igual que en el ejemplo anterior, se copia una cadena desde CODE hacia XDATA. En este caso el tiempo que se tarda en copiar la cadena se reduce un 50% con respecto al caso anterior. La nueva strcpy() se ha llamado strcpy_x_c().
El prototipo de la función es:
extern char xdata *strcpy_x_c(char xdata*,char code *) ;
y a continuación se ofrece el código generado:
; char xdata *strcpy_x_c(char xdata *s1, char code *s2) { _strcpy_x_c: MOV s2?10,R4 MOV s2?10+01H,R5 ;__ Variable 's1?10' assigned to Register 'R6/R7' __ ; unsigned char i = 0; ;__ Variable 'i?11' assigned to Register 'R1' __ CLR A MOV R1,A ?C0004: ; ; while ((s1[i++] = *s2++) != 0); INC s2?10+01H MOV A,s2?10+01H MOV R4,s2?10 JNZ ?C0008 INC s2?10 ?C0008: DEC A MOV DPL,A MOV DPH,R4 CLR A MOVC A,@A+DPTR MOV R5,A MOV R4,AR1 INC R1 MOV A,R7 ADD A,R4 MOV DPL,A CLR A ADDC A,R6 MOV DPH,A MOV A,R5 MOVX @DPTR,A JNZ ?C0004 ?C0005: ; return (s1); ; } ?C0006: END |