51单片机间接寻址问题

16位相加程序,为什么不直接MOV A,20H MOV R0,21HADD A,R0 ?为什么要用间接寻址?R0只能用间接寻址吗?

其实,这种程序纯粹是为了使用指令而故意写的,并没有什么意义。
这个程序就是为了讲间接寻址指令的使用。而目的并不是为了计算什么数。
如果就是为了计算什么数,采用什么寻址方式都行,只要能计算出来就行。
如果按你的想法来写,还可以更简化

MOV A,20H
ADD A,22H
MOV 20H,A
MOV A,21H
ADDC A,23H
MOV 21H,A
可问题是,如果数据多的时候,这种方式写程序就会很长,采用间接寻址方式程序就简单。所以,要看具体情况而定。
另外,纠正一下你的程序
MOV A,20H
MOV R0,21H;这应该是MOV R0,22H,因21H中的数是第一个数的高8位。
ADD A,R0追问

麻烦再问一个问题:
START:
MOV DPTR,#8000H
MOV R0,#20H
MOV R1,#20H
START1:
MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R1,START1
这段程序是将片内RAM从20H开始的20个字节送到片外8000H开始的单元去,其中START1中的前两句可不可以用 一句 MOVX @DPTR,R0 代替?为什么需要用累加器A?

追答

因为根本就没有 MOVX @DPTR,R0 这条指令,这不是开汽车,你想往哪开就往哪开。

写程序,必须要用指令系统中有的指令,不能靠想像,想什么是什么。
MOVX指令,是访问外部存储器的,只能通过A来读/写,只有这种指令。其它都是无效的,是瞎编的。
用汇编语言写程序,就必须掌握指令系统,所以,不好学。
比较好学的,还是C语言,就不用考虑这些问题了。

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