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 .