ZJM001 发表于 2024-10-31 11:23:16

关于汇编中堆栈和ram的问题

rt,51单片机中的用户ram是从30h-7fh,堆栈也是在这个区域中,有几个问题;1.请问如果用push/pop的堆栈区域的总容量是多少?是直接从30h开始连续存放吗?如果是这样的话那么通过直接寻址就能访问到堆栈中元素了,是不是和堆栈思想不符?
2. 堆栈的容量是固定的吗,会小于整体用户ram区容量吗?如果是的话如果自己用ram中非堆栈区作为自己的临时变量应该从多少地址开始?

谢谢

ZJM001 发表于 2024-10-31 12:01:42

顶起来求回复

hsrzq 发表于 2024-11-1 10:07:52

本帖最后由 hsrzq 于 2024-11-1 10:14 编辑

1. 理论上是data/idata所有空间,从00H开始都可以,不必非从30H开始。
但实际上00H~1FH有特殊功能(四组通用寄存器),20H~2FH也有特殊功能(位寻址区),为了发挥最大作用才把这部分让开的。
没有什么不符,RAM做出来就是让用的,栈只是使用RAM的其中一种方式,但绝不是唯一方式。访问中间的数据是很常见的操作,仅限制成栈的先进后出反而束手束脚,限制了程序开发的灵活性。
2. 没有特别的规定一定要从哪开始,都是根据实际情况灵活变化的。个人建议是把30H~7FH这段给临时变量,栈从80H开始。这样临时变量在直接寻址区的话汇编指令简单些且效率略高一点

ZJM001 发表于 2024-11-1 20:53:55

hsrzq 发表于 2024-11-1 10:07
1. 理论上是data/idata所有空间,从00H开始都可以,不必非从30H开始。
但实际上00H~1FH有特殊功能(四组 ...

请问一下您对于2的回答:您把30H~7FH这段给临时变量,80H开始到FFH不是应该是特殊寄存器区域吗?如果让栈从80H开始会不会造成栈和特殊功能寄存器冲突?

hsrzq 发表于 2024-11-1 23:07:54

ZJM001 发表于 2024-11-1 20:53
请问一下您对于2的回答:您把30H~7FH这段给临时变量,80H开始到FFH不是应该是特殊寄存器区域吗?如果让 ...

不会冲突。
80H到FFH这个段实际上有两块空间,直接寻址就是特殊寄存器,间接寻址就是普通RAM。
当作栈使用的话,实际访问的是普通RAM区,和特殊寄存器没有一丁点儿关系

ZJM001 发表于 2024-11-5 12:14:28

hsrzq 发表于 2024-11-1 23:07
不会冲突。
80H到FFH这个段实际上有两块空间,直接寻址就是特殊寄存器,间接寻址就是普通RAM。
当作栈使 ...

好的,非常谢谢你
页: [1]
查看完整版本: 关于汇编中堆栈和ram的问题