如何在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
所以问题是我不知道将结果存储在哪里(返回)。是否应该像在本示例中那样为函数创建一个变量并将其存储在那里?
答案 0 :(得分:1)
为了在Hack中实现真正的函数调用,您需要首先实现下推堆栈。一旦完成,就相对简单了。
然后,要进行函数调用,请用返回地址加载D并将其压入。对于单参数函数调用,可以在D中传递function参数;对于多参数调用,您还需要将这些值压入堆栈。
然后您无条件跳转到该函数。在函数中,您需要执行任何操作(包括从堆栈中弹出所有参数)。最后,将返回地址从堆栈中弹出到A中,然后无条件跳转。
返回操作可以通过4条指令完成。呼叫操作需要9条指令。
如果保证函数是非递归的,则可以省去堆栈,并将函数参数(包括返回地址)放在与每个函数关联的固定内存块中。