我的汇编器可以正确翻译数字常量,但前提是该常量是指令中的第四个字。如何更改我的代码,以便当数字常量是指令中的第二个或第三个单词时它也可以翻译?例如,我可以成功翻译 ADD A D 5 和 JLT D,A 39 等指令,但不能成功翻译 LOADN 127 或 JEQ A,125。
这是我执行翻译的方法
```
private void translateOneInstruction(String line) {
String[] segment = line.split("[\\s,]+");
System.err.println(Arrays.toString(segment));
if (segment.length > 0) {
switch (segment[0]) {
case "LOADN":
output.print("0000");
break;
case "LOADA":
output.print("0001");
break;
case "ADD":
output.print("0010");
break;
case "SUB":
output.print("0011");
break;
case "JMP":
output.print("0100");
break;
case "JGT":
output.print("0101");
break;
case "JLT":
output.print("0110");
break;
case "JEQ":
output.print("0111");
break;
case "COPY":
output.print("1000");
break;
case "STORE":
output.print("1001");
break;
default:
System.err.println("Error line NNN");
break;
}
}
if (segment.length > 1) {
switch (segment[1]) {
case "A":
output.print("01");
break;
case "D":
output.print("10");
break;
default:
System.err.println("Error line NNN");
return;
}
} else {
output.print("00");
}
if (segment.length > 2) {
switch (segment[2]) {
case "A":
output.print("01");
break;
case "D":
output.print("10");
break;
default:
System.err.println("Error line NNN");
return;
}
} else {
output.print("00");
}
output.println();
if (segment.length > 3) {
int number = Integer.parseInt(segment[3]);
String numericConstant = String.format("%8s", Integer.toBinaryString(number)).replace(' ', '0');
output.println(numericConstant);
}
}
```
从根本上来说,该代码正在丢弃有价值的信息。在进行确定操作码的工作后,该确定仅用于发出操作码本身,但不用于通知如何处理操作数。
通常,指令集架构具有格式,每种格式都有一定数量和类型的允许操作数 - 每条指令将采用其中一种格式的形式。
所以,你能做的是:
if ( opcode == "ADD" ) { emit ( "0000"); format = Three_operand; } break;
...
switch ( format ) {
case Three_operand: ... break;
}
if ( opcode == "ADD" ) { emit ( "0000" ); handle3operands (); } break;
// nothing left to do here as common code is invoked by function call.