单片机高手过来帮忙

来源:百度知道 编辑:UC知道 时间:2024/05/28 18:58:45
题目:设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处。
程序:ORG 1000H
MOV R0,#30H
MOV R1,#40H
MOV R2,#16
CLR C
LOOP:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,LOOP
END
问题1:MOV R2,#16是十进制吧,怎么也行的?
问题2:INC R0 INC R1为什么要这两句
问题3:ADDC A,@R1后,R1中还有没有内容?
重点解释为什么加INC R0和INC R1

问题1:又没有规定不能有十进制,我们老师讲课一只都用十进制,因为容易计算,儿十六进制只是个习惯而已!

问题2:R1和R2中存放的是地址,每进行一次循环,计算一次,也就是一个字节加上一个字节,算完了,当然是要计算下一个字节了!这两句自加语句只是控制地址的!

问题3:有,只要后面的不用它,他的内容就不变,你的程序后面用到了,所以它一直在加1,直到程序结束!

找本书看看你就知道怎么回事了.

1. 十进制、二进制、八进制、十六进制都可以只是表示方法不同。如 30H -十六进制,16 - 十进制等。
2. INC RO自己加一,只能是寄存器才能自加
3. R1的内容不变

INC RO 表示 RO = RO + 1 而不能用 30H = 30H + 1

1.不管十进制还是十六进制,编译后都会转化为二进制,因此无区别
2.MOV A,@R0是间接寻址,原本R0的值为30H,当你MOV A,@R0后,就是将地址30H中的值给A,后面的INC R0只是将R0的值加1,使用间接寻址语句后,就相当于地址加1,取的就是寄存器31H中的值。
3.3的问题其实跟2是一样的!!