因此,在学习 nand2tetris 课程时,我陷入了这个问题。
基本上这个问题与构建虚拟机有关。虚拟机与 JVM 非常相似。
这里有两个主要部分需要考虑:
call foo 2
:该指令告诉 vm 调用foo
带有 2 个参数的函数(在此调用之前应将其压入堆栈顶部)。function foo 4
:这不是 function 中的第一条指令foo
,但它仍然对 SP 有影响,因为这意味着 functionfoo
有 4 个局部变量。这些变量必须位于某个地方。在哪里?在栈顶。这意味着在foo
执行第一条“真实”指令之前,我们必须将 4 个值压入堆栈。什么价值观?好吧 - 根据 vm 规范,它应该是0
's,导致局部变量被初始化为 0。这也意味着我们为每个局部变量增加 SP(SP + 4)由此得出结论,SP 在调用之后foo
但在执行该函数的第一条指令之前将具有 314 的值。