Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Java模拟汇编_Java_Assembly - Fatal编程技术网

Java模拟汇编

Java模拟汇编,java,assembly,Java,Assembly,编写模拟机器代码的Java程序的最佳方法是什么?例如,我需要创建一系列指令,如加法、减法、增量、减量等。 假设我正在编写add指令,它接受3个参数/寄存器(将前2个寄存器中的值相加,并将结果存储在第3个寄存器中)。它是否像编写以下函数那样简单: int add(int x, int y) { int result; result = x + y; return result; } 我也有可能在这里偏离了底线。任何输入都将不胜感激。模拟汇编的最佳方法是处理原始位和字节,并相应地

编写模拟机器代码的Java程序的最佳方法是什么?例如,我需要创建一系列指令,如加法、减法、增量、减量等。 假设我正在编写add指令,它接受3个参数/寄存器(将前2个寄存器中的值相加,并将结果存储在第3个寄存器中)。它是否像编写以下函数那样简单:

int add(int x, int y) {
   int result;
   result = x + y;
   return result; }

我也有可能在这里偏离了底线。任何输入都将不胜感激。

模拟汇编的最佳方法是处理原始位和字节,并相应地执行操作

当然可以,但最重要的是如何打开操作码并进行所有地址字段计算。 通常,地址字段可以包含文字常量、全局地址、寄存器、相对于寄存器的偏移量等。
这取决于您是在模拟一台简单的机器还是一台真正的机器。

如果您只想编写与机器指令大致为1:1的Java代码,我建议您为所有寄存器创建变量,并为大多数指令定义方法(与您建议的类似)。但这不会“限制”您可以像实际机器指令那样执行的操作,因为当机器可能不允许时,您可以将BX reg乘以AX reg

更好的做法是定义一个类,该类表示所有指令的机器状态(即寄存器和RAM)和类上的方法。那么,除非有MUL_BX_AX方法,否则不能将BX乘以AX。许多方法没有参数(因为寄存器在“不透明”对象中),但有些方法有PARM,其中“实”指令将接受偏移量或其他内容。(例如,添加AX IMMED(5)。)


补充道:不过,分支问题需要一些额外的思考。Java没有一个GOTO等价物来很好地填补这个角色,因此最初(直到你想到更好的东西),你可能不得不使用标准的
if
/
else
逻辑,等等,在机器状态类中测试“条件代码”。

你可以用
开关
块来实现指令的操作,在处理参数之前/之后添加内容这取决于您想要支持的操作。如果你想处理跳跃之类的事情,事情会变得复杂得多!您希望模拟哪个cpu?如果你有选择的话,选择一个8位的CPU,比如Z80