51单片机汇编,为什么程序修改不了数组的内容???求大神帮忙啊

程序如下:

ORG 60H
TAB:
DB 01H,02H,03H,04H,05H,06H,07H

TAB1:
DB 00H,00H,00H,00H,00H,00H,00H

ORG 00H
START:
MOV DPTR,#TAB
MOV R7,#0
LOOP:
MOV A,R7
MOVC A,@A+DPTR
MOV R2,A

MOV DPTR,#TAB1
MOV A,R7
ADD A,DPL
;在这里,我想把数组TAB的值,一个一个复制到数组TAB1
MOV DPL,A
MOV A,R2
;数据一个一个地以间址的方式,存回到TAB1中
MOVX @DPTR,A
INC R7

CJNE R7,#8,LOOP

MOV R7,#0
;在这里,我想验证一下数组TAB的数据有没有复制到TAB1来,但是我监视R1的输出结果,表明的确没有将TAB的数据复制到TAB1来。
LOOP1:

MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV R1,A
INC R7
CJNE R7,#8,LOOP1

END

另外,在我发现复制不成功的情况下,我修改了一下程序,程序如下:

ORG 60H
TAB:
DB 01H,02H,03H,04H,05H,06H,07H

TAB1:
DB 00H,00H,00H,00H,00H,00H,00H

ORG 00H
START:
MOV DPTR,#TAB
MOV R7,#0
LOOP:
MOV A,R7
MOVC A,@A+DPTR
MOV R2,A

MOV DPTR,#TAB1
MOV A,R7
ADD A,DPL
;因为TAB1的首地址是67H,所以DPTR其实低8位能够表示
MOV DPL,A
;将偏移地址送到R0,做一次间址寻址,将TAB中查表获得的数据送到R0间址的地址中去
MOV R0,DPL
MOV A,R2
MOV @R0,A
INC R7

CJNE R7,#8,LOOP

MOV R7,#0
LOOP1:

MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV R1,A
INC R7
CJNE R7,#8,LOOP1

END

遗憾,结果TAB1仍然全部都是0,我不明白为什么了!

读数组:
……

MOV DPTR,#TAB
MOV R7,#0
LOOP:
MOV A,R7
MOVC A,@A+DPTR ;从ROM中读出
……
---------------------
;在这里,我想把数组TAB的值,一个一个复制到数组TAB1
MOV DPL,A
MOV A,R2
;数据一个一个地以间址的方式,存回到TAB1中

MOVX @DPTR,A--写入到片外RAM了
……
---------------------
;在这里,我想验证一下数组TAB的数据有没有复制到TAB1来,
但是我监视R1的输出结果,表明的确没有将TAB的数据复制到TAB1来。
LOOP1:

MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR--从ROM中读出
MOV R1,A
INC R7
CJNE R7,#8,LOOP1

END
---------------------
关键的问题,就是:

楼主,还没有弄清楚,51单片机存储空间的分类。追问

谢谢回答,我想问一下,在第二段程序中,我使用了MOV @R0,A来做一次间址,但是也不行,原因在哪儿呢?@r0是ROM里面的地址吧

追答

@r0是ROM里面的地址吧
------------
看来,楼主还是不清楚,51单片机存储空间的分类。

@r0,永远不能,和ROM,有任何的联系。
------------
楼主的第一步,
是从 ROM 中的 TAB 读出数据,一个一个复制到数组TAB1。

那么,TAB1 是什么地方?

你定义的 TAB1,还是 ROM。

ROM,你能写入吗?
------------
楼主的第二步,
......一个一个复制到数组TAB1。

MOVX @DPTR,A

你用的这条指令,是把数据写入到片外RAM了
片外RAM,!!!
这里,并不是 ROM 的 TAB1。

写入片外RAM,理论上成立,
实际上,要求,你必须有外接的存储器芯片。

------------
楼主的第三步:
验证数组TAB的数据有没有复制到TAB1来,

MOV DPTR,#TAB1
MOVC A,@A+DPTR--从ROM中读出

你这是从 ROM 的 TAB1 读出。
ROM 的 TAB1,你也不可能写入数据,你读的什么呢?

追问

如果要实现数组的复制,应该怎么写TAB1才能复制得进去呢?

追答

应该怎么写TAB1才能复制得进去呢?
----------------
你的TAB1,是定义在ROM之中。
ROM,是只读的意思。

在程序运行期间,肯定,是写不进去的。

你的想法,从一开始,就是错误的。
----
你可以写到《片外RAM》或《片内RAM》。

写到这两部分后,再读出时,就应该从这两部分里,读出。
而不应该去读出 TAB1。
----
你原来的程序,验证时,是从 ROM 的 TAB1 读出。
ROM 中的 TAB1,你也不可能写入数据,你读的什么呢?
----------------
你应该认真看一下:
51单片机存储空间的分类、特点、读写方法等等。

温馨提示:答案为网友推荐,仅供参考