我正在观看视频什么是堆栈以及我们为什么需要它?这是课程的一部分,讲师向我们展示了如何使用 Javascript 制作 16 位 VM。
我的问题来自视频帧之一中堆栈的表示。
让我快速向大家介绍一下这个框架中发生的事情。在图像的左侧,我们有所有寄存器:
ip
:指令指针
acc
:蓄能器
r1
- r4
:通用寄存器
sp
: Stack Pointer
在图像的右上部分,我们有接下来要执行的指令。下面是堆栈的当前状态。
现在,正如您在图像中看到的,sp
当前指向地址$fffa
,对应的值为$0000
。在此之前,sp
指向地址$fffc
,要执行的指令是psh r2
。同样,在此之前,sp
指向地址$fffe
和指令的是psh r1
。
现在,我在整个场景中不明白的是地址会随着我们向下移动而增加,例如顶部的地址$ffe6
和它下面的地址$ffe8
明显大于其前身,并且地址不断增加。但是为什么我们的堆栈指针首先sp
以地址开头呢?$fffe
我知道堆栈以FILO(先进后出)/LIFO(后进先出)方式工作,如果我们只是忽略地址的顺序,我们就会遵循 FILO/LIFO。但让我困惑的是地址的顺序。如果我们将堆栈逆时针旋转 90 度,那么我们的堆栈将看起来像这样。
我旋转堆栈的原因是为了了解内存地址在任何体系结构中的布局方式。
现在,我有这些问题。
为什么堆栈指针从堆栈中的最后一个地址开始?
这真的是所有语言中堆栈的实现方式吗?
这种实现堆栈的方式是否有助于避免由于堆栈溢出而出现的问题?
跟栈和堆在内存中的存储方式有关系吗?
如果我们从地址开始,会有什么变化$ffe6
?
我可能在一个帖子中问了很多问题,但请最注意最后一个问题,因为我认为它可能会回答所有其他问题。谢谢你。
喵喔喔
相关分类