Hack汇编语言中的Java函数
如何在Hack Assembly中实现Java函数?我知道更改变量的指令很容易,但HACK如何调用函数呢? 例如:Hack汇编语言中的Java函数,java,assembly,calling-convention,nand2tetris,Java,Assembly,Calling Convention,Nand2tetris,如何在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 @func
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
所以问题是我不知道在哪里存储结果(return)…我是否应该像在本例中那样为函数创建一个变量并将其存储在那里?为了在Hack中实现真正的函数调用,您需要首先实现一个下推堆栈。一旦做到了这一点,就相对简单了 然后,为了进行函数调用,您用返回地址加载D并按下它。对于单参数函数调用,可以在D中传递函数参数;对于多参数调用,还需要将这些值推送到堆栈上 然后无条件跳转到函数。在函数中,您可以执行任何需要执行的操作(包括从堆栈中弹出任何参数)。最后,将返回地址从堆栈弹出到一个无条件跳转中 返回操作可以在4个指令中完成。呼叫操作需要9条指令
如果函数保证是非递归的,则可以省去堆栈,将函数参数(包括返回地址)放入与每个函数相关联的固定内存块中。您是在询问如何实现Java语言的所有功能,还是只询问此特定Java函数?如果是后者,那么真正的问题是如何在Hack中编写有符号的max函数,最好使用条件分支。如果是前者,那么它显然是一种广义的方法。或者您主要是问如何传递和返回函数args/返回值?(我实际上一点也不懂Hack,所以我无法回答,只有适用于真正CPU(如x86、MIPS和ARM)的汇编语言。一些x86调用约定在堆栈上传递参数,但好的约定在寄存器中传递参数。)相关:on retrocomputing.SE