汇编代码修改:处理指令中不同位置的数字常量”

问题描述 投票:0回答:1

我的汇编器可以正确翻译数字常量,但前提是该常量是指令中的第四个字。如何更改我的代码,以便当数字常量是指令中的第二个或第三个单词时它也可以翻译?例如,我可以成功翻译 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);
        }
   }
```
java assembly binary numbers
1个回答
0
投票

从根本上来说,该代码正在丢弃有价值的信息。在进行确定操作码的工作后,该确定仅用于发出操作码本身,但不用于通知如何处理操作数。

通常,指令集架构具有格式,每种格式都有一定数量和类型的允许操作数 - 每条指令将采用其中一种格式的形式。

所以,你能做的是:

  • 设置一个指示该操作码格式的变量,然后处理格式:
    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.
© www.soinside.com 2019 - 2024. All rights reserved.