打印
[51单片机]

单片机RAM清零的问题(汇编)

[复制链接]
3996|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbc0602|  楼主 | 2014-3-4 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
虽然有些单片机的基础,但是很少实际运用在工作中。最近老板叫我写一个测试电路板的程序,程序一开头就ORG 0000H
LJMP START
ORG 0BH
LJMP TM0
START:
XXXX
TM0:
XXXX
END
挨老板说了。原因是我跳转到START的时候应该没有对00H到0C0H之间的RAM清零,SP默认地址是07H,我也没有设置。
清零内存:
MOV R0,#0C0H
MOV A,#00
LOOP: MOV @R0,A
DJNZ R0,LOOP
设置SP堆栈起始地址:
MOV SP,#0C0H

想问下这样做有什么好处?求详解

相关帖子

沙发
hbc0602|  楼主 | 2014-3-4 14:11 | 只看该作者
没人用汇编了吗?

使用特权

评论回复
板凳
cqxyy| | 2014-3-4 15:04 | 只看该作者
ORG 00H
LJMP START
ORG 0BH
LJMP TM0
ORG 0A0H   ;因0BH后面还不好几个中断地址(看单片机工作代码避开中断地址,)
START:
XXXXX
:初始化代码;(用于中断,SP ,定时器,RAM清零 ~~~~~)

LOOP:
XXXX:主循环,闭环


LJMP LOOP;



TM0:
XXXX
END


(1)SP上电后是从07h开始  比如用call 指令  会有入栈 08H的内容会被修,如果call程序里改08H内容程序在call返回时会跑飞
(2)初始化时RAM清零好处:如果mcu 热复位 RAM的内容不是00H,有可的错乱的,系统用了错的RAM数据有可能继续错乱

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hbc0602 + 1 很给力!
地板
ayb_ice| | 2014-3-4 15:15 | 只看该作者
变量一般都初始化为零

使用特权

评论回复
5
ningling_21| | 2014-3-4 15:28 | 只看该作者
本帖最后由 ningling_21 于 2014-3-4 15:29 编辑

SP写成C0H,这样不太好,80H以上RAM都是间接寻址区,只能间接访问...

经常把SP搞成60H比较安全...

使用特权

评论回复
6
受不了了| | 2014-3-4 15:43 | 只看该作者
ningling_21 发表于 2014-3-4 15:28
SP写成C0H,这样不太好,80H以上RAM都是间接寻址区,只能间接访问...

经常把SP搞成60H比较安全... ...

不要想当然,你试一下sp搞成C0H死机不

使用特权

评论回复
7
ayb_ice| | 2014-3-4 15:47 | 只看该作者
ningling_21 发表于 2014-3-4 15:28
SP写成C0H,这样不太好,80H以上RAM都是间接寻址区,只能间接访问...

经常把SP搞成60H比较安全... ...

栈操作本来就是间接寻址

只要MCU有256字节内部RAM,设为高于080H才是正道

使用特权

评论回复
8
受不了了| | 2014-3-4 15:47 | 只看该作者
楼主的程序会成为死循环

使用特权

评论回复
9
hbc0602|  楼主 | 2014-3-5 09:06 | 只看该作者
ayb_ice 发表于 2014-3-4 15:47
栈操作本来就是间接寻址

只要MCU有256字节内部RAM,设为高于080H才是正道

你意思是SP设为0C0H是对的?80H以上都是寄存器的地址了吧,这样设置堆栈会不会和寄存器的使用冲突了呢?比如P0的地址是80H,SP又设置为80H,这时:
PUSH ACC
PUSH PSW
MOV P0,#55H
...
POP PSW
POP ACC
这样本来入栈的A的值不是被改变了吗?

使用特权

评论回复
10
ayb_ice| | 2014-3-5 09:32 | 只看该作者
hbc0602 发表于 2014-3-5 09:06
你意思是SP设为0C0H是对的?80H以上都是寄存器的地址了吧,这样设置堆栈会不会和寄存器的使用冲突了呢? ...

你连51的内存都没有搞清楚,先去看书吧

使用特权

评论回复
11
ningling_21| | 2014-3-5 09:35 | 只看该作者
受不了了 发表于 2014-3-4 15:47
楼主的程序会成为死循环

怎么会呢?

使用特权

评论回复
12
hbc0602|  楼主 | 2014-3-5 10:48 | 只看该作者
ayb_ice 发表于 2014-3-5 09:32
你连51的内存都没有搞清楚,先去看书吧

我的理解就是这样...

使用特权

评论回复
13
dufanbao| | 2014-3-5 13:15 | 只看该作者
标准51,80H以上有寄存器地址,直接寻址。52来说,也就是扩展了128B的ram,80H以上的寄存器地址是直接寻址,内存是间接寻址,在这种情况下sp可以设置成0C0H。sp设置成多大,要看编译后的map文件而定。

使用特权

评论回复
14
受不了了| | 2014-3-5 17:32 | 只看该作者
ningling_21 发表于 2014-3-5 09:35
怎么会呢?

嗯,我粗心了,是这里用R1才会死循环

使用特权

评论回复
15
cjseng| | 2014-3-6 00:12 | 只看该作者
用汇编,SP设置成C0H不一定对啊,要看你一共用了多少个变量决定的,如果你的变量都定义到C0H后面去了,那SP设置成C0H也要出错。
可能的情况下,SP设置的越小越安全,小心堆栈溢出啊。

使用特权

评论回复
16
NE5532| | 2014-3-6 12:58 | 只看该作者
SP确实要初始化,不然堆栈可能破坏其他数据。汇编不要求RAM必须清0,可能是你们老板个人习惯而已,我就不清,只是用之前必须初始化。

使用特权

评论回复
17
hbc0602|  楼主 | 2014-3-6 22:51 | 只看该作者
NE5532 发表于 2014-3-6 12:58
SP确实要初始化,不然堆栈可能破坏其他数据。汇编不要求RAM必须清0,可能是你们老板个人习惯而已,我就不清 ...

他的每一个程序都有写初始化。对这个内存分配还是不大理解...

使用特权

评论回复
18
立新家电维修| | 2014-3-9 16:54 | 只看该作者
好东西,我也是高汇编的入门,呵呵

使用特权

评论回复
19
sz_walter| | 2014-3-9 17:54 | 只看该作者
上电后RAM内容是不确定的,而在调用变量之前总要给它赋个初值吧!统一清0总比单个清0要省事。20H-7FH空间可直接寻址,堆栈区放这里有点浪费资源。

使用特权

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

本版积分规则

5

主题

27

帖子

0

粉丝