Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Memory 与NAND2TTERIS中的虚拟机相关的混淆_Memory_Stack_Virtual Machine_Nand2tetris - Fatal编程技术网

Memory 与NAND2TTERIS中的虚拟机相关的混淆

Memory 与NAND2TTERIS中的虚拟机相关的混淆,memory,stack,virtual-machine,nand2tetris,Memory,Stack,Virtual Machine,Nand2tetris,所以,在学习NAND2TTERIS课程时,我陷入了这个问题 基本上,这个问题与构建虚拟机有关。虚拟机非常类似于JVM。 这里有2个主要部分要考虑: call foo 2:此指令告诉vm调用带有2个参数的函数foo(在调用之前应将其推到堆栈顶部) 调用任何函数都意味着您应该按如下步骤执行:将返回地址推到堆栈顶部(SP++),然后推LCL、ARG、THIS、that(SP+4)。此时,SP应等于310 函数foo 4:这不是函数foo中的第一条指令,但它仍然对SP有影响,因为这意味着函数foo有4个

所以,在学习NAND2TTERIS课程时,我陷入了这个问题


基本上,这个问题与构建虚拟机有关。虚拟机非常类似于JVM。

这里有2个主要部分要考虑:

  • call foo 2
    :此指令告诉vm调用带有2个参数的函数
    foo
    (在调用之前应将其推到堆栈顶部)
    调用任何函数都意味着您应该按如下步骤执行:将返回地址推到堆栈顶部(SP++),然后推LCL、ARG、THIS、that(SP+4)。此时,SP应等于310
  • 函数foo 4
    :这不是函数
    foo
    中的第一条指令,但它仍然对SP有影响,因为这意味着函数
    foo
    有4个局部变量。这些变量必须位于某个地方。哪里在堆栈的顶部。这意味着在执行
    foo
    的第一条“real”指令之前,我们必须将4个值推送到堆栈上。什么价值观?好的-根据do vm规范,它应该是
    0
    ,导致局部变量被初始化为0。这也意味着我们增加每个局部变量的SP(SP+4)
  • 这就得出结论,在调用
    foo
    之后但在执行此函数的第一条指令之前,SP的值将为314