求助-请教一个简单的单片机汇编程序问题

[复制链接]
 楼主| 发表于 2008-3-22 02:11 | 显示全部楼层 |阅读模式
<br /><br /><br /><br />今天看了一个程序,由于是初学者,对其中的奥妙不是特别的懂,望各位大侠帮忙解释下,谢谢哦,谢谢哦。。。<br /><br />多字节BCD码加法&nbsp;<br />入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。&nbsp;<br />出口信息:和在[R0]中,最高位进位在CY中。&nbsp;<br />影响资源:PSW、A、R2&nbsp;堆栈需求:&nbsp;2字节&nbsp;<br />BCDA:&nbsp;MOV&nbsp;A,R7&nbsp;;取字节数至R2中&nbsp;<br />MOV&nbsp;R2,A&nbsp;<br /><font color=#000000><font color=#0000FF>ADD&nbsp;A,R0&nbsp;;初始化数据指针&nbsp;</font></font><br /><font color=#000000><font color=#0000FF>MOV&nbsp;R0,A&nbsp;</font></font><br /><font color=#000000><font color=#0000FF>MOV&nbsp;A,R2&nbsp;</font></font><br /><font color=#000000><font color=#0000FF>ADD&nbsp;A,R1&nbsp;</font></font><br /><font color=#000000><font color=#0000FF>MOV&nbsp;R1,A&nbsp;</font></font><br /><font color=#000000><font color=#0000FF>CLR&nbsp;C</font>&nbsp;</font><br /><font color=#FF0000>BCD1:&nbsp;DEC&nbsp;R0&nbsp;;调整数据指针&nbsp;</font><br /><font color=#FF0000>DEC&nbsp;R1&nbsp;</font><br />MOV&nbsp;A,@R0&nbsp;<br />ADDC&nbsp;A,@R1&nbsp;;按字节相加&nbsp;<br />DA&nbsp;A&nbsp;;十进制调整&nbsp;<br />MOV&nbsp;@R0,A&nbsp;;和存回[R0]中&nbsp;<br /><font color=#008000>DJNZ&nbsp;R2,BCD1&nbsp;;处理完所有字节&nbsp;</font><br />RET&nbsp;<br /><br /><font color=#0000FF></font><font color=#0000FF>疑问:</font>&nbsp;<br /><font color=#0000FF>1、蓝色部分:功能是把A上的数据放到R0,R1,为什么不用MOV&nbsp;R0,A&nbsp;MOV&nbsp;R1,A?</font>&nbsp;<font color=#FF0000></font><br /><font color=#FF0000>2、红色部分:搞不懂为什么又要自减了?</font>&nbsp;<br /><font color=#008000>3、绿色部分:不明白?循环的程序中好像没出现R2?</font>&nbsp;<br /><br /><font color=#008000></font>呵呵,初学者,问题比较浅,望大家帮忙哦~拜谢了。。。
发表于 2008-3-22 08:53 | 显示全部楼层

蓝色部分,当然是要将R0R1加上字节数。加上字节数后R0R1指向待加数据之后那个位置。<br />红色部分,减一正好指向第一个数据。<br />绿色部分,DJNZ&nbsp;R2,BCD1&nbsp;中有R2,R2为零刚好把所有数据加完。
 楼主| 发表于 2008-3-22 09:11 | 显示全部楼层

还是疑问?

呵呵,有点明白了?<br /><br />不过对蓝色部分还是有疑问,为什么要那么复杂的编程?<br /><br />为什么不能用:MOV&nbsp;R0,A<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;R1,A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代替?
发表于 2008-3-22 09:20 | 显示全部楼层

当初存放数据就这样放好了

例如四个加数,放在地址m+0、m+1、m+2、m+3的四个单元,R0在运行之前内容必须赋值m+0(首址),R0加4(字节数)后为m+4,指向数据区之后那个单元。
发表于 2008-3-22 09:24 | 显示全部楼层

还是疑问?

我也看不明白﹐为什么不可以像LZ说的那样直接用MOV转移﹖﹖
发表于 2008-3-22 10:20 | 显示全部楼层

这牵涉到子程序编写的一个原则

最好是子程序执行完之后,各工作寄存器没有变化。<br />从低地址开始加,执行完毕,R0R1指向数据区之后。如楼主给出的做法,执行完毕R0R1仍指向数据区首址。<br />程序开始将R7内容复制到R2也是这个目的,复制就是为了R7内容不变化。
发表于 2008-3-22 19:44 | 显示全部楼层

re

楼主这样学习&nbsp;一定学的很快。
 楼主| 发表于 2008-3-23 13:34 | 显示全部楼层

谢谢各位的帮助饿

<br />谢谢各位的帮助饿。。嘿嘿。。
发表于 2008-3-26 11:36 | 显示全部楼层

*

学习了&nbsp;
发表于 2008-3-27 11:51 | 显示全部楼层

评评

你好好看看51书籍,因为51中说明可送立即数,也可间接送数.在这里就属于一种间接送数.在寄存器中的数不可以直接给寄存器,它的通过A累加器传送数据.
发表于 2008-3-27 15:53 | 显示全部楼层

说说

好好看看书确实不错,以后有什么难出我们可以探讨着来吗?不行交个朋友,时常联系着有问题就提能解决就解决不能就求助.
发表于 2008-3-27 23:25 | 显示全部楼层

我也在学习

我也在学习。楼主似乎没有弄清楚A寄存器的值每执行一个指令都在变化的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝
快速回复 返回顶部 返回列表