Contenido>Indice>Intro CursoC51

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

 


   Contenido>Indice>Intro CursoC51