所以当我在nand2tetris上上一门课的时候,我被困在了这个问题上。


基本上,这个问题与构建虚拟机有关。虚拟机与JVM非常相似。
发布于 2020-12-15 00:33:19
这里有两个主要部分需要考虑:
call foo 2:这条指令告诉vm调用带有2个参数(应该在调用之前推到堆栈的顶部)的foo。调用任何函数都意味着您应该执行以下步骤:推堆栈顶部的返回地址(SP++),然后推送LCL、ARG、THIS、that ( SP+4)。此时SP应该等于310.
function foo 4:这不是函数foo中的第一个指令,但是它仍然对SP有影响,因为这意味着函数foo有4个局部变量。这些变量必须位于某个地方。哪里?堆的顶端。这意味着在执行foo的第一个“真实”指令之前,我们必须将4个值推到堆栈上。什么价值观?根据do规范,它应该是0的,从而导致局部变量被初始化为0。这也意味着我们增加了每个局部变量( SP + 4)的SP值。
由此得出的结论是,SP在调用foo后,在执行该函数的第一条指令之前,其值为314。
https://stackoverflow.com/questions/65292819
复制相似问题