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

[复制链接]
4635|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 | 显示全部楼层
变量一般都初始化为零
ningling_21 发表于 2014-3-4 15:28 | 显示全部楼层
本帖最后由 ningling_21 于 2014-3-4 15:29 编辑

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

经常把SP搞成60H比较安全...
受不了了 发表于 2014-3-4 15:43 来自手机 | 显示全部楼层
ningling_21 发表于 2014-3-4 15:28
SP写成C0H,这样不太好,80H以上RAM都是间接寻址区,只能间接访问...

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

不要想当然,你试一下sp搞成C0H死机不
ayb_ice 发表于 2014-3-4 15:47 | 显示全部楼层
ningling_21 发表于 2014-3-4 15:28
SP写成C0H,这样不太好,80H以上RAM都是间接寻址区,只能间接访问...

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

栈操作本来就是间接寻址

只要MCU有256字节内部RAM,设为高于080H才是正道
受不了了 发表于 2014-3-4 15:47 来自手机 | 显示全部楼层
楼主的程序会成为死循环
 楼主| 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的值不是被改变了吗?
ayb_ice 发表于 2014-3-5 09:32 | 显示全部楼层
hbc0602 发表于 2014-3-5 09:06
你意思是SP设为0C0H是对的?80H以上都是寄存器的地址了吧,这样设置堆栈会不会和寄存器的使用冲突了呢? ...

你连51的内存都没有搞清楚,先去看书吧
ningling_21 发表于 2014-3-5 09:35 | 显示全部楼层
受不了了 发表于 2014-3-4 15:47
楼主的程序会成为死循环

怎么会呢?
 楼主| hbc0602 发表于 2014-3-5 10:48 | 显示全部楼层
ayb_ice 发表于 2014-3-5 09:32
你连51的内存都没有搞清楚,先去看书吧

我的理解就是这样...
dufanbao 发表于 2014-3-5 13:15 | 显示全部楼层
标准51,80H以上有寄存器地址,直接寻址。52来说,也就是扩展了128B的ram,80H以上的寄存器地址是直接寻址,内存是间接寻址,在这种情况下sp可以设置成0C0H。sp设置成多大,要看编译后的map文件而定。
受不了了 发表于 2014-3-5 17:32 来自手机 | 显示全部楼层
ningling_21 发表于 2014-3-5 09:35
怎么会呢?

嗯,我粗心了,是这里用R1才会死循环
cjseng 发表于 2014-3-6 00:12 | 显示全部楼层
用汇编,SP设置成C0H不一定对啊,要看你一共用了多少个变量决定的,如果你的变量都定义到C0H后面去了,那SP设置成C0H也要出错。
可能的情况下,SP设置的越小越安全,小心堆栈溢出啊。
NE5532 发表于 2014-3-6 12:58 | 显示全部楼层
SP确实要初始化,不然堆栈可能破坏其他数据。汇编不要求RAM必须清0,可能是你们老板个人习惯而已,我就不清,只是用之前必须初始化。
 楼主| hbc0602 发表于 2014-3-6 22:51 | 显示全部楼层
NE5532 发表于 2014-3-6 12:58
SP确实要初始化,不然堆栈可能破坏其他数据。汇编不要求RAM必须清0,可能是你们老板个人习惯而已,我就不清 ...

他的每一个程序都有写初始化。对这个内存分配还是不大理解...
立新家电维修 发表于 2014-3-9 16:54 | 显示全部楼层
好东西,我也是高汇编的入门,呵呵
sz_walter 发表于 2014-3-9 17:54 | 显示全部楼层
上电后RAM内容是不确定的,而在调用变量之前总要给它赋个初值吧!统一清0总比单个清0要省事。20H-7FH空间可直接寻址,堆栈区放这里有点浪费资源。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

27

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部