C51的堆栈问题

C51的堆栈问题是很容易被忽略的问题,至少我之前是这样.今天早上查了一下,需要注意的问题有这么几点:

1.上电后自动设置堆栈指针SP的值(SP=0x2F)

C:0x0000    02006A   LJMP     C:006A
C:0x006A    787F     MOV      R0,#0x7F
C:0x006C    E4       CLR      A
C:0x006D    F6       MOV      @R0,A
C:0x006E    D8FD     DJNZ     R0,C:006D
C:0x0070    75812F   MOV      SP(0x81),#0x2F
C:0x0073    020003   LJMP     main(C:0003)
如代码所示,上电后直接跳转到某个地址,延时一段时间后,设置SP的值,然后才进入Main函数,执行我们定义的函数.

然而,我在STC12C5A60的数据手册中却看到:单片机复位后,堆栈指针SP为07H,指向了工作寄存器组0中的R7.也就是说SP的值是可以任意指定的,只要不与其它内存重叠.


2.C51的堆栈是向上生长的,这与ARM的向下生长不同.


3.STC12C5A60手册上还写到:用户初始化程序都应对SP设置初值,一般设在80H之后.

问题来了,80H--FFH不是特殊功能寄存器区吗?这样设置会产生重叠吗?答案是,不会重叠.

原因:高128字节RAM与特殊功能寄存器区都用80H--FFH,地址空间确实重叠,但物理上却是相互独立的.使用时通过不同的寻址方式加以区别,当内存使用时只能间接寻址,而特殊功能寄存器区只能寻址.用代码表示,就应该是这样的:

间接寻址:

MOV R0,#80H

MOV R1,@R0

直接寻址:

MOV R1,80H


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值