打印

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

[复制链接]
1979|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liang99740|  楼主 | 2008-3-22 02:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式




今天看了一个程序,由于是初学者,对其中的奥妙不是特别的懂,望各位大侠帮忙解释下,谢谢哦,谢谢哦。。。

多字节BCD码加法 
入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。 
出口信息:和在[R0]中,最高位进位在CY中。 
影响资源:PSW、A、R2 堆栈需求: 2字节 
BCDA: MOV A,R7 ;取字节数至R2中 
MOV R2,A 
ADD A,R0 ;初始化数据指针 
MOV R0,A 
MOV A,R2 
ADD A,R1 
MOV R1,A 
CLR C 
BCD1: DEC R0 ;调整数据指针 
DEC R1 
MOV A,@R0 
ADDC A,@R1 ;按字节相加 
DA A ;十进制调整 
MOV @R0,A ;和存回[R0]中 
DJNZ R2,BCD1 ;处理完所有字节 
RET 

疑问: 
1、蓝色部分:功能是把A上的数据放到R0,R1,为什么不用MOV R0,A MOV R1,A? 
2、红色部分:搞不懂为什么又要自减了? 
3、绿色部分:不明白?循环的程序中好像没出现R2? 

呵呵,初学者,问题比较浅,望大家帮忙哦~拜谢了。。。

相关帖子

沙发
maychang| | 2008-3-22 08:53 | 只看该作者

蓝色部分,当然是要将R0R1加上字节数。加上字节数后R0R1指向待加数据之后那个位置。
红色部分,减一正好指向第一个数据。
绿色部分,DJNZ R2,BCD1 中有R2,R2为零刚好把所有数据加完。

使用特权

评论回复
板凳
liang99740|  楼主 | 2008-3-22 09:11 | 只看该作者

还是疑问?

呵呵,有点明白了?

不过对蓝色部分还是有疑问,为什么要那么复杂的编程?

为什么不能用:MOV R0,A
              MOV R1,A     代替?

使用特权

评论回复
地板
maychang| | 2008-3-22 09:20 | 只看该作者

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

例如四个加数,放在地址m+0、m+1、m+2、m+3的四个单元,R0在运行之前内容必须赋值m+0(首址),R0加4(字节数)后为m+4,指向数据区之后那个单元。

使用特权

评论回复
5
she828| | 2008-3-22 09:24 | 只看该作者

还是疑问?

我也看不明白﹐为什么不可以像LZ说的那样直接用MOV转移﹖﹖

使用特权

评论回复
6
maychang| | 2008-3-22 10:20 | 只看该作者

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

最好是子程序执行完之后,各工作寄存器没有变化。
从低地址开始加,执行完毕,R0R1指向数据区之后。如楼主给出的做法,执行完毕R0R1仍指向数据区首址。
程序开始将R7内容复制到R2也是这个目的,复制就是为了R7内容不变化。

使用特权

评论回复
7
jerkoh| | 2008-3-22 19:44 | 只看该作者

re

楼主这样学习 一定学的很快。

使用特权

评论回复
8
liang99740|  楼主 | 2008-3-23 13:34 | 只看该作者

谢谢各位的帮助饿


谢谢各位的帮助饿。。嘿嘿。。

使用特权

评论回复
9
qguangdong| | 2008-3-26 11:36 | 只看该作者

*

学习了 

使用特权

评论回复
10
王会锋| | 2008-3-27 11:51 | 只看该作者

评评

你好好看看51书籍,因为51中说明可送立即数,也可间接送数.在这里就属于一种间接送数.在寄存器中的数不可以直接给寄存器,它的通过A累加器传送数据.

使用特权

评论回复
11
王会锋| | 2008-3-27 15:53 | 只看该作者

说说

好好看看书确实不错,以后有什么难出我们可以探讨着来吗?不行交个朋友,时常联系着有问题就提能解决就解决不能就求助.

使用特权

评论回复
12
qinjinzhi| | 2008-3-27 23:25 | 只看该作者

我也在学习

我也在学习。楼主似乎没有弄清楚A寄存器的值每执行一个指令都在变化的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝