nand2tetris中虚拟机相关的困惑

Confusion related to virtual machine in nand2tetris

因此,在学习 nand2tetris 课程时,我陷入了这个问题。

基本上这个问题是关于构建虚拟机的。虚拟机和JVM很像。

这里主要考虑两个部分:

  1. call foo 2 :这条指令告诉 vm 调用带有 2 个参数的函数 foo(应该在调用之前将其压入栈顶)。
    调用任何函数意味着您应该执行以下步骤:将 return 地址压入栈顶 (SP++),然后压入 LCL、ARG、THIS、THAT (SP+4)。此时SP应该等于310.
  2. function foo 4 :这不是函数 foo 中的第一条指令,但它仍然对 SP 有影响,因为这意味着函数 foo 有 4 个局部变量。这些变量必须位于某个地方。在哪里?在堆栈的顶部。这意味着在执行 foo 的第一条 'real' 指令之前,我们必须将 4 个值压入堆栈。什么价值观?好吧 - 根据 do vm 规范,它应该是 0's,导致局部变量被初始化为 0。这也意味着我们为每个局部变量增加 SP(SP + 4)

这导致 SP 在调用 foo 之后但在执行该函数的第一条指令之前的值为 314。