打印
[51单片机]

KEIL堆栈地址分配问题,求指教

[复制链接]
2123|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
彪哥|  楼主 | 2016-1-15 23:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
laoxu| | 2016-1-16 06:55 | 只看该作者
不冲突!

堆栈地址为0X8C,在 IDATA 中,“TH0”的地址在 DATA 中, 请仔细看看技术手册。

使用特权

评论回复
板凳
mcu5i51| | 2016-1-16 09:06 | 只看该作者
地址复用,51很奇葩

使用特权

评论回复
地板
彪哥|  楼主 | 2016-1-16 12:27 | 只看该作者
楼上两位,我更晕了!:Q  求指教
手册说“堆栈指针寄存器 SP 的地址是0X81,复位值为0X07”。
我的理解是:堆栈指针寄存器 SP 属于特设功能寄存器,其地址位置位于片内高128字节,即0x80-0xff空间,而复位值0X07是指0x81单元的内容为0x07,即指向低128字节的0x07位置,而后0x81的内容虽程序运行自动调整。
我想问的是:如果指针内容调整到了0x81后,又如何变化?是跳过0X81继续加1,还是堆栈溢出了?

使用特权

评论回复
5
datouyuan| | 2016-1-16 16:25 | 只看该作者
本帖最后由 datouyuan 于 2016-1-16 16:27 编辑

你还是没理解51的地址复用.
SP复位值0X07,但是编译器会再进入main()前会给SP赋一个适当的值.
0x80-0xff空间 直接寻址时是访问SFR(也就是SP,TH0等寄存器),间接寻址时是内存(或你说的堆栈).
0x0-0x7f空间  直接,间接都是访问内存.

通过sp(地址0X81)值访问内存,就是间接寻址,可以访问内存范围0x0-0xff.
直接修改sp(地址0X81)值,是直接寻址,修改的就是sp的值.

使用特权

评论回复
6
彪哥|  楼主 | 2016-1-17 23:11 | 只看该作者
datouyuan 发表于 2016-1-16 16:25
你还是没理解51的地址复用.
SP复位值0X07,但是编译器会再进入main()前会给SP赋一个适当的值.
0x80-0xff空间 ...

多谢指教!明细了!:lol

使用特权

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

本版积分规则

44

主题

171

帖子

1

粉丝