首页 > 解决方案 > Hack 汇编语言中的 Java 函数

问题描述

如何在 Hack Assembly 中实现 Java 函数?我知道更改变量的指令很容易制作,但是 HACK 是如何调用函数的呢?例如:

function(int a, int b) {
if (a-b > 0)
return a;
else
return b;
}

我的(我认为错误的)结果是:

@a
D=M
@b
D=D-M 
@JUMPMARK1
D;JGT
@Jumpmark2
0;JMP
(JUMPMARK1)
@a
D=M 
@function
M=D
(Jumpmark2)
@b
D=M
@function
M=D

所以问题是我不知道在哪里存储结果(返回)..我应该像在这个例子中为函数创建一个变量并将它存储在那里吗?

标签: javaassemblycalling-conventionnand2tetris

解决方案


为了在 Hack 中实现真正的函数调用,首先需要实现一个下推堆栈。一旦完成,它就相对简单了。

然后,为了进行函数调用,你加载 D 和返回地址并推送它。对于单参数函数调用,您可以在 D 中传递函数参数;对于多参数调用,您还需要将这些值推送到堆栈中。

然后,您无条件跳转到该函数。在函数中,您可以做任何您需要做的事情(包括从堆栈中弹出任何参数)。最后,将返回地址从堆栈中弹出到 A 中并无条件跳转。

返回操作可以用 4 条指令完成。调用操作需要 9 条指令。

如果保证函数是非递归的,则可以省去堆栈,将函数参数(包括返回地址)放在与每个函数关联的固定内存块中。


推荐阅读