wlhet 发表于 2024-11-16 11:46:36

仅替换251.exe即可吗

LAOXU 发表于 2024-11-17 12:23:06

zxcv1973 发表于 2024-11-15 18:12
pdata数据类型编译是什么错误,可否发个例子来,我用这个老版本编译器编译了几个pdata数据类型,编译的都 ...

这个问题有点复杂, 不是编译通不过, 而是仿真运行得不到想要的结果.

下面我抽空写了一个实例, 编译无错误, 你可仿真运行后, 观看一下字符串考贝后的结果.

注: 将 pdata 改成 xdata , 仿真运行结果正确.

LAOXU 发表于 2024-11-17 12:23:51

#include <STC32G.H>

volatileunsigned char pdata tab3;
volatileunsigned char data i;       
          unsigned char code tab1[]="AbcD";
volatileunsigned char pdata tab2;
volatilechar pdata *p;
               
void main(void)
{ volatilechar pdata *p1;

        for(i=0; i<=5; i++)
       tab2 = tab1;                     

          p = tab2;
                p1 = tab3;
        for(i=0; i<=5; i++)
       *p1++ = *p++;                     
               
while(1);
}            


社区闲人 发表于 2024-11-17 19:14:58

试了下,很好用,谢谢楼主。

zxcv1973 发表于 2024-11-18 10:30:00

LAOXU 发表于 2024-11-17 12:23
这个问题有点复杂, 不是编译通不过, 而是仿真运行得不到想要的结果.

下面我抽空写了一个实例, 编译无错 ...

当然不是指编译通不过,而是指编译出错误的指令代码

zxcv1973 发表于 2024-11-18 10:37:23

LAOXU 发表于 2024-11-17 12:23
#include

volatileunsigned char pdata tab3;


用旧版本的编译器编译出的指令代码没有问题,挑不出什么毛病:

   9: void main(void)
    10: { volatilechar pdata *p1;
    11:
    12:         for(i=0; i<=5; i++)
0xFF0003   750800      MOV      i(0x08),#0x00
0xFF0006   801B      SJMP   C:0x0023
    13:      tab2 = tab1;                     
    14:
0xFF0008   E508      MOV      A,i(0x08)
0xFF000A   0A3B      MOVZ   WR6,R11
0xFF000C   2E340069    ADD      WR6,#0x0069
0xFF0010   7A7182      MOV      DPL(0x82),R7
0xFF0013   7A6183      MOV      DPH(0x83),R6
0xFF0016   E4          CLR      A
0xFF0017   93          MOVC   A,@A+DPTR
0xFF0018   7C0B      MOV      R0,R11
0xFF001A   7E1108      MOV      R1,i(0x08)
0xFF001D   2E1000      ADD      R1,#0x00
0xFF0020   F3          MOVX   @R1,A
0xFF0021   0508      INC      i(0x08)
0xFF0023   E508      MOV      A,i(0x08)
0xFF0025   BEB005      CMP      R11,#0x05
0xFF0028   28DE      JLE      C:0x0008
    15:         p = tab2;   
0xFF002A   7E7000      MOV      R7,#0x00
0xFF002D   7A730009    MOV      p(0x0009),R7
    16:               p1 = tab3;   
0xFF0031   7E0005      MOV      R0,#0x05
    17:         for(i=0; i<=5; i++)
0xFF0034   750800      MOV      i(0x08),#0x00
0xFF0037   8011      SJMP   C:0x004A
    18:      *p1++ = *p++;                     
    19:                  
0xFF0039   7E130009    MOV      R1,p(0x0009)
0xFF003D   7CB1      MOV      R11,R1
0xFF003F   04          INC      A
0xFF0040   7AB30009    MOV      p(0x0009),R11
0xFF0044   E3          MOVX   A,@R1
0xFF0045   F2          MOVX   @R0,A
0xFF0046   0B00      INC      R0,#0x01
0xFF0048   0508      INC      i(0x08)
0xFF004A   E508      MOV      A,i(0x08)
0xFF004C   BEB005      CMP      R11,#0x05
0xFF004F   28E8      JLE      C:0x0039
    20: while(1);
0xFF0051   80FE      SJMP   C:0x0051

bkeuqoaq 发表于 2024-11-18 11:32:43

pdata效率明显高于xdata为什么不用,这都太成熟了,不可能有问题

bkeuqoaq 发表于 2024-11-18 11:43:30

本帖最后由 bkeuqoaq 于 2024-11-18 11:44 编辑

LAOXU 发表于 2024-11-17 12:23
#include

volatileunsigned char pdata tab3;

汇编分析没有问题,这是最新版本编译的
不过251确实没有使用pdata的必要
; line 140: void main(void)
; line 141: {
; line 142:         volatilechar pdata *p1;
; line 143:
; line 144:         for(i=0; i<=5; i++)
      MOV      i,#00H
      SJMP   ?C0004
?C0005:
; line 145:               tab2 = tab1;                     
      MOV      A,i                            ; A=R11
      MOVZ   WR6,R11                        ; A=R11
      ADD      WR6,#WORD0 tab1
      MOV      DPL,R7                         ; WORD0(DR56)=DPTR
      MOV      DPH,R6                         ; WORD0(DR56)=DPTR
      CLR      A                              ; A=R11
      MOVC   A,@A+DPTR                      ; A=R11
      MOV      R1,i
      ADD      R1,#LOW tab2
      MOVX   @R1,A                        ; A=R11
      INC      i
?C0004:
      MOV      A,i                            ; A=R11
      CMP      R11,#05H                     ; A=R11
      JLE      ?C0005
; line 146:
; line 147:         pp = tab2;
      MOV      pp,#LOW tab2
; line 148:         p1 = tab3;
      MOV      R0,#LOW tab3
;---- Variable 'p1' assigned to Register 'R0' ----
; line 149:         for(i=0; i<=5; i++)
      MOV      i,#00H
      SJMP   ?C0009
?C0010:
; line 150:               *p1++ = *pp++;                     
      MOV      R1,pp
      MOVX   A,@R1                        ; A=R11
      MOV      R10,R11                        ; A=R11
      MOV      R11,R1                         ; A=R11
      INC      A                              ; A=R11
      MOV      pp,A                           ; A=R11
      MOV      R11,R10                        ; A=R11
      MOVX   @R0,A                        ; A=R11
      INC      R0,#01H
      INC      i
?C0009:
      MOV      A,i                            ; A=R11
      CMP      R11,#05H                     ; A=R11
      JLE      ?C0010
; line 151:
; line 152:         while(1);
?C0012:
      SJMP   ?C0012
      ENDP
; line 153: }   

      END

LAOXU 发表于 2024-11-18 17:12:29

zxcv1973 发表于 2024-11-18 10:30
当然不是指编译通不过,而是指编译出错误的指令代码

当然不是指编译通不过,而是指编译出的指令代码, 执行错误!

需用仿真查看实际 tab2 ,tab3 .

LAOXU 发表于 2024-11-18 17:13:38

bkeuqoaq 发表于 2024-11-18 11:32
pdata效率明显高于xdata为什么不用,这都太成熟了,不可能有问题

当然不是指编译通不过,而是指编译出的指令代码, 执行错误!

需用仿真查看实际 tab2 ,tab3 .
页: 1 [2] 3 4
查看完整版本: 发现以前老版本的C251编译器几乎无BUG,并且和C51编译器高度一致