Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 堆栈如何在其中存储值?_Javascript_Assembly_Stack_Cpu Architecture_Callstack - Fatal编程技术网

Javascript 堆栈如何在其中存储值?

Javascript 堆栈如何在其中存储值?,javascript,assembly,stack,cpu-architecture,callstack,Javascript,Assembly,Stack,Cpu Architecture,Callstack,我正在看一段视频,这是一门课程的一部分,讲师向我们展示了如何用Javascript制作16位虚拟机 我的问题来自视频的一帧中堆栈的表示 让我快速向你们介绍一下这一框架中发生的事情。在图像的左侧,我们有所有的寄存器: ip:指令指针 acc:累加器 r1-r4:通用寄存器 sp:堆栈指针 在图像的右上部分,我们有下一个要执行的指令。下面是堆栈的当前状态 现在,如图所示,sp当前指向地址$fffa,对应的值为$0000。在此之前,sp指向地址$fffc,要执行的指令是psh r2。类似地,在此之

我正在看一段视频,这是一门课程的一部分,讲师向我们展示了如何用Javascript制作16位虚拟机

我的问题来自视频的一帧中堆栈的表示

让我快速向你们介绍一下这一框架中发生的事情。在图像的左侧,我们有所有的寄存器:

  • ip
    :指令指针
  • acc
    :累加器
  • r1
    -
    r4
    :通用寄存器
  • sp
    堆栈指针
在图像的右上部分,我们有下一个要执行的指令。下面是堆栈的当前状态

现在,如图所示,
sp
当前指向地址
$fffa
,对应的值为
$0000
。在此之前,
sp
指向地址
$fffc
,要执行的指令是
psh r2
。类似地,在此之前,
sp
指向地址
$fffe
,指令是
psh r1

现在,我不明白的是,在整个场景中,地址会随着我们的下移而增加,例如,顶部的地址是
$ffe6
,下面的地址是
$ffe8
,它明显大于它的前一个地址,并且地址会不断增加。但是为什么我们的堆栈指针
sp
首先以地址
$fffe
开头呢?我知道堆栈的工作方式是FILO(先进先出)/LIFO(后进先出)方式,如果我们忽略地址序列,我们就是在遵循FILO/LIFO。但让我困惑的是地址的顺序。如果我们逆时针旋转我们的堆栈90度,那么我们的堆栈看起来就像这样。

我之所以旋转堆栈,是为了了解内存地址在任何体系结构中的布局

现在,我有这些问题

  • 为什么堆栈指针从堆栈中的最后一个地址开始
  • 这真的是所有语言中堆栈的实现方式吗
  • 这种实现堆栈的方法是否有助于避免由于堆栈溢出而出现的问题
  • 它是否与堆栈和堆在内存中的存储方式有关
  • 如果我们从地址
    $ffe6
    开始,会发生什么变化

  • 我可能在一篇文章中问了很多问题,但请你把注意力集中在最后一个问题上,因为我认为它可能回答所有其他问题。谢谢。

    这个问题非常接近于过于宽泛且主要基于观点的界限,但我知道你在问什么

    了解历史上有无数不同的处理器设计和系统实现。语言和处理器都是随着时间的推移而发展的。因此,任何绝对语句实际上都是有限的,因为毫无疑问,有一个系统或处理器不适用于该语句

    一般来说,堆栈只是内存,堆栈指针只是内存中的地址/偏移量,push/pop与普通内存访问的区别在于程序员通常不关心/不应该关心特定的地址,而是相对的,我推了五个东西,所以第三个东西离堆栈指针这么远,为了清理,我需要弹出5个东西,等等,但它只是一个内存的某个地方与地址指针

    虽然我们认为编号较低的地址是较低的,编号较高的地址是较高的,并且预期内存的图形/可视化显示图中编号较低的地址在图中较低,编号较高的地址在图中较高,但有时有很好的理由,有时也没有,这是颠倒的。在一个芯片上,没有一个真正的上升或下降,也没有一个假设,即内存是以某种长的物理线性2D方式布置的,这些都是简单的可视化

    我不知道有什么异常,但处理器通常是按地址递增的方向执行的,地址0x1000处的指令长度为4字节,下一条指令假定为0x1004,而不是0xFFC。所以让我们假设代码向上增长,或者从较低的地址增长到较高的地址

    让我们假设我们的固件运行在ram中,而不是闪存中,我们讨论的是ram的消耗。从纯金属的角度考虑,并不是一个同时加载多个应用程序的操作系统

    程序通常会有一些代码(通常称为.text)、一些数据、(全局)变量等(通常称为.data和.bss)。堆,它是运行时分配的内存和堆栈

    我没有研究过这一点,但根据我所学的内容和名字本身,人们可以把这一堆看作是一堆盘子或一堆便笺卡。由于重力,它向上生长。与处理器体系结构无关,将堆栈视为向上增长,新项目放在旧项目的顶部,移除顶部项目以获取较低项目的情况并不少见。但这并不是那么死板,不确定它是否是50/50,但你会经常看到它像向上和向下一样可视化。或者是一个滑动窗口,其中堆栈指针在图表中不可视地移动,但数据根据显示方式向上或向下移动

    还要注意的是,这个站点的名称,堆栈溢出,这个术语对它的含义有一个特殊的假设

    因此,直截了当地说,经典模型(后面提到了例外情况)是,从较低的内存开始,或者让我们假设为零,你有你的代码,机器代码以及属于这一类的任何其他代码。然后是全局变量.data和.bss,然后是堆,最上面是堆栈。堆和堆栈在运行时被认为是动态的。若你们从来并没有空闲过,那个么堆被认为是向上增长的。所以自然