[51单片机] KEIL堆栈地址分配问题,求指教

[复制链接]
2366|5
 楼主| 彪哥 发表于 2016-1-15 23:22 | 显示全部楼层 |阅读模式
本帖最后由 彪哥 于 2016-1-15 23:24 编辑

89s52 单片机程序编译后,M51文件显示的堆栈地址为0X8C,可这个地址应该是“TH0”呀,这个不冲突吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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,还是堆栈溢出了?
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的值.
 楼主| 彪哥 发表于 2016-1-17 23:11 | 显示全部楼层
datouyuan 发表于 2016-1-16 16:25
你还是没理解51的地址复用.
SP复位值0X07,但是编译器会再进入main()前会给SP赋一个适当的值.
0x80-0xff空间 ...

多谢指教!明细了!:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

171

帖子

1

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