Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hack汇编语言中的Java函数_Java_Assembly_Calling Convention_Nand2tetris - Fatal编程技术网

Hack汇编语言中的Java函数

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

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

所以问题是我不知道在哪里存储结果(return)…我是否应该像在本例中那样为函数创建一个变量并将其存储在那里?

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

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

然后无条件跳转到函数。在函数中,您可以执行任何需要执行的操作(包括从堆栈中弹出任何参数)。最后,将返回地址从堆栈弹出到一个无条件跳转中

返回操作可以在4个指令中完成。呼叫操作需要9条指令


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

您是在询问如何实现Java语言的所有功能,还是只询问此特定Java函数?如果是后者,那么真正的问题是如何在Hack中编写有符号的max函数,最好使用条件分支。如果是前者,那么它显然是一种广义的方法。或者您主要是问如何传递和返回函数args/返回值?(我实际上一点也不懂Hack,所以我无法回答,只有适用于真正CPU(如x86、MIPS和ARM)的汇编语言。一些x86调用约定在堆栈上传递参数,但好的约定在寄存器中传递参数。)相关:on retrocomputing.SE