【问题标题】:Java functions in Hack assembly LanguageHack 汇编语言中的 Java 函数
【发布时间】:2018-08-07 09:39:41
【问题描述】:

如何在 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

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

【问题讨论】:

  • 您是要实现 Java 语言的所有功能,还是只涉及这个特定的 Java 功能?如果是后者,那么您真正的问题是如何在 Hack 中编写带符号的 max 函数,最好使用条件分支。如果是前者,那么它显然是宽泛的。或者你主要是问如何传递和返回函数参数/返回值? (我实际上根本不知道 Hack,所以我无法回答,只是用于 x86、MIPS 和 ARM 等真实 CPU 的汇编语言。一些 x86 调用约定在堆栈上传递参数,但好的调用约定在寄存器中传递参数。)

标签: java assembly calling-convention nand2tetris


【解决方案1】:

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

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多