Memory 与NAND2TTERIS中的虚拟机相关的混淆
所以,在学习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个
基本上,这个问题与构建虚拟机有关。虚拟机非常类似于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