nand2tetris中虚拟机相关的困惑
Confusion related to virtual machine in nand2tetris
因此,在学习 nand2tetris 课程时,我陷入了这个问题。
基本上这个问题是关于构建虚拟机的。虚拟机和JVM很像。
这里主要考虑两个部分:
call foo 2
:这条指令告诉 vm 调用带有 2 个参数的函数 foo
(应该在调用之前将其压入栈顶)。
调用任何函数意味着您应该执行以下步骤:将 return 地址压入栈顶 (SP++),然后压入 LCL、ARG、THIS、THAT (SP+4)。此时SP应该等于310.
function foo 4
:这不是函数 foo
中的第一条指令,但它仍然对 SP 有影响,因为这意味着函数 foo
有 4 个局部变量。这些变量必须位于某个地方。在哪里?在堆栈的顶部。这意味着在执行 foo
的第一条 'real' 指令之前,我们必须将 4 个值压入堆栈。什么价值观?好吧 - 根据 do vm 规范,它应该是 0
's,导致局部变量被初始化为 0。这也意味着我们为每个局部变量增加 SP(SP + 4)
这导致 SP 在调用 foo
之后但在执行该函数的第一条指令之前的值为 314。
因此,在学习 nand2tetris 课程时,我陷入了这个问题。
基本上这个问题是关于构建虚拟机的。虚拟机和JVM很像。
这里主要考虑两个部分:
call foo 2
:这条指令告诉 vm 调用带有 2 个参数的函数foo
(应该在调用之前将其压入栈顶)。
调用任何函数意味着您应该执行以下步骤:将 return 地址压入栈顶 (SP++),然后压入 LCL、ARG、THIS、THAT (SP+4)。此时SP应该等于310.function foo 4
:这不是函数foo
中的第一条指令,但它仍然对 SP 有影响,因为这意味着函数foo
有 4 个局部变量。这些变量必须位于某个地方。在哪里?在堆栈的顶部。这意味着在执行foo
的第一条 'real' 指令之前,我们必须将 4 个值压入堆栈。什么价值观?好吧 - 根据 do vm 规范,它应该是0
's,导致局部变量被初始化为 0。这也意味着我们为每个局部变量增加 SP(SP + 4)
这导致 SP 在调用 foo
之后但在执行该函数的第一条指令之前的值为 314。