This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

arrays and ptrs: what are C_CSTOPTR and C_ISTOPTR for

Dear all,

I have problems with string in C51, and confused about the array and ptr processing in C51 while investigating the assembly code generated.

What is C_CSTOPTR and C_ISTOPTR for in the code?

Please note C_CSTOPTR is in char* access code, and C_ISTOPTR is in int[] code.

  71   1         unsigned char *cp = (unsigned char *)malloc(5);
  72   1         unsigned char ca[5];
  73   1         unsigned int  *ia = (unsigned int *)malloc(10);
  74   1         unsigned int  ip[5];
  75   1      
  76   1         for (i=0; i<5; i++) {
  77   2            ca[i] = i;
  78   2            cp[i] = i;
  79   2            ia[i] = i;
  80   2            ip[i] = i;
  81   2         }

Below is generated for the above code:

                                           ; SOURCE LINE # 77
0034 AF00    R     MOV     R7,i+01H
0036 7400    R     MOV     A,#LOW ca
0038 2500    R     ADD     A,i+01H
003A F582          MOV     DPL,A
003C E500    R     MOV     A,i
003E 3400    R     ADDC    A,#HIGH ca
0040 F583          MOV     DPH,A
0042 EF            MOV     A,R7
0043 F0            MOVX    @DPTR,A
                                           ; SOURCE LINE # 78
0044 900000  R     MOV     DPTR,#cp
0047 E0            MOVX    A,@DPTR
0048 FB            MOV     R3,A
0049 A3            INC     DPTR
004A E0            MOVX    A,@DPTR
004B FA            MOV     R2,A
004C A3            INC     DPTR
004D E0            MOVX    A,@DPTR
004E F9            MOV     R1,A
004F 850082  R     MOV     DPL,i+01H
0052 850083  R     MOV     DPH,i
0055 EF            MOV     A,R7
0056 120000  E     LCALL   ?C_CSTOPTR
                                           ; SOURCE LINE # 79
0059 E500    R     MOV     A,i+01H
005B 25E0          ADD     A,ACC
005D FF            MOV     R7,A
005E E500    R     MOV     A,i
0060 33            RLC     A
0061 FE            MOV     R6,A
0062 900000  R     MOV     DPTR,#ia
0065 E0            MOVX    A,@DPTR
0066 FB            MOV     R3,A
0067 A3            INC     DPTR
0068 E0            MOVX    A,@DPTR
0069 FA            MOV     R2,A
006A A3            INC     DPTR
006B E0            MOVX    A,@DPTR
006C F9            MOV     R1,A
006D 8F82          MOV     DPL,R7
006F 8E83          MOV     DPH,R6
0071 E500    R     MOV     A,i
0073 8500F0  R     MOV     B,i+01H
0076 120000  E     LCALL   ?C_ISTOPTR
                                           ; SOURCE LINE # 80
0079 E500    R     MOV     A,i+01H
007B 25E0          ADD     A,ACC
007D FF            MOV     R7,A
007E E500    R     MOV     A,i
0080 33            RLC     A
0081 FE            MOV     R6,A
0082 7400    R     MOV     A,#LOW ip
0084 2F            ADD     A,R7
0085 F582          MOV     DPL,A
0087 EE            MOV     A,R6
0088 3400    R     ADDC    A,#HIGH ip
008A F583          MOV     DPH,A
008C E500    R     MOV     A,i
008E F0            MOVX    @DPTR,A
008F A3            INC     DPTR
0090 E500    R     MOV     A,i+01H
0092 F0            MOVX    @DPTR,A

Parents
  • Please note C_CSTOPTR is in char* access code, and C_ISTOPTR is in int[] code.

    Hummmmm, I don't think it's correct because the C_CSTOPTR is in char* ( OK ), but the C_ISTOPTR is in int* code.

      71   1         unsigned char *cp = (unsigned char *)malloc(5);
      72   1         unsigned char ca[5];
      73   1         unsigned int  *ia = (unsigned int *)malloc(10);
      74   1         unsigned int  ip[5];
      75   1      
      76   1         for (i=0; i<5; i++) {
      77   2            ca[i] = i;
      78   2            cp[i] = i;
      79   2            ia[i] = i;
      80   2            ip[i] = i;
      81   2         }

    As far as I'm concerned you chose the variable name based in the method of data access, ca for an array and cp for a pointer ( c = char ).
    When you used the int data type, probably you mischanged the name. ia is your pointer and the access will use C_ISTOPTR.

    0044 900000  R     MOV     DPTR,#cp
    0047 E0            MOVX    A,@DPTR
    0048 FB            MOV     R3,A
    0049 A3            INC     DPTR
    004A E0            MOVX    A,@DPTR
    004B FA            MOV     R2,A
    004C A3            INC     DPTR
    004D E0            MOVX    A,@DPTR
    004E F9            MOV     R1,A
    004F 850082  R     MOV     DPL,i+01H
    0052 850083  R     MOV     DPH,i
    0055 EF            MOV     A,R7
    0056 120000  E     LCALL   ?C_CSTOPTR
                                               ; SOURCE LINE # 79
    0059 E500    R     MOV     A,i+01H
    005B 25E0          ADD     A,ACC
    005D FF            MOV     R7,A
    005E E500    R     MOV     A,i
    0060 33            RLC     A
    0061 FE            MOV     R6,A
    0062 900000  R     MOV     DPTR,#ia
    0065 E0            MOVX    A,@DPTR
    0066 FB            MOV     R3,A
    0067 A3            INC     DPTR
    0068 E0            MOVX    A,@DPTR
    0069 FA            MOV     R2,A
    006A A3            INC     DPTR
    006B E0            MOVX    A,@DPTR
    006C F9            MOV     R1,A
    006D 8F82          MOV     DPL,R7
    006F 8E83          MOV     DPH,R6
    0071 E500    R     MOV     A,i
    0073 8500F0  R     MOV     B,i+01H
    0076 120000  E     LCALL   ?C_ISTOPTR

Reply
  • Please note C_CSTOPTR is in char* access code, and C_ISTOPTR is in int[] code.

    Hummmmm, I don't think it's correct because the C_CSTOPTR is in char* ( OK ), but the C_ISTOPTR is in int* code.

      71   1         unsigned char *cp = (unsigned char *)malloc(5);
      72   1         unsigned char ca[5];
      73   1         unsigned int  *ia = (unsigned int *)malloc(10);
      74   1         unsigned int  ip[5];
      75   1      
      76   1         for (i=0; i<5; i++) {
      77   2            ca[i] = i;
      78   2            cp[i] = i;
      79   2            ia[i] = i;
      80   2            ip[i] = i;
      81   2         }

    As far as I'm concerned you chose the variable name based in the method of data access, ca for an array and cp for a pointer ( c = char ).
    When you used the int data type, probably you mischanged the name. ia is your pointer and the access will use C_ISTOPTR.

    0044 900000  R     MOV     DPTR,#cp
    0047 E0            MOVX    A,@DPTR
    0048 FB            MOV     R3,A
    0049 A3            INC     DPTR
    004A E0            MOVX    A,@DPTR
    004B FA            MOV     R2,A
    004C A3            INC     DPTR
    004D E0            MOVX    A,@DPTR
    004E F9            MOV     R1,A
    004F 850082  R     MOV     DPL,i+01H
    0052 850083  R     MOV     DPH,i
    0055 EF            MOV     A,R7
    0056 120000  E     LCALL   ?C_CSTOPTR
                                               ; SOURCE LINE # 79
    0059 E500    R     MOV     A,i+01H
    005B 25E0          ADD     A,ACC
    005D FF            MOV     R7,A
    005E E500    R     MOV     A,i
    0060 33            RLC     A
    0061 FE            MOV     R6,A
    0062 900000  R     MOV     DPTR,#ia
    0065 E0            MOVX    A,@DPTR
    0066 FB            MOV     R3,A
    0067 A3            INC     DPTR
    0068 E0            MOVX    A,@DPTR
    0069 FA            MOV     R2,A
    006A A3            INC     DPTR
    006B E0            MOVX    A,@DPTR
    006C F9            MOV     R1,A
    006D 8F82          MOV     DPL,R7
    006F 8E83          MOV     DPH,R6
    0071 E500    R     MOV     A,i
    0073 8500F0  R     MOV     B,i+01H
    0076 120000  E     LCALL   ?C_ISTOPTR

Children