1

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

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

4

1 回答 1

1

这里有两个主要部分需要考虑:

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

由此得出结论,SP 在调用之后foo但在执行该函数的第一条指令之前将具有 314 的值。

于 2020-12-15T00:33:19.007 回答