assembly 如何将数字转换为二进制以便汇编

vd2z7a6w  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(47)

谁能给予指导我如何把数字从汇编程序的指令转换成它们的二进制等价物?数字的范围可以从0到255,需要8位长。
下面是我的方法,它执行从指令到它们的二进制等价物的转换

public void translateInstruction(String instruction) {
String[] parts = instruction.split("[\s,]+");
System.err.println(Arrays.toString(parts));

    if (parts.length > 0) {
        switch (parts[0]) {
            case "LOADN":
                output.print("1111");
               break;
            case "LOADA":
            output.print("1110");
            break;
            case "ADD":
            output.print("1101");
            break;
            case "SUB":
            output.print("1100");
            break;
            case "JMP":
            output.print("1011");
            break;
            case "COPY":
            output.print("1000");
            break;
            case "STORE":
            output.print("1001");
            break;
         
       }
    }

    if (parts.length > 1) {
        switch (parts[1]) {
            case "A":
               output.print("01");
                break;
            case "D":
                output.print("10");
                break;
            
        }
    } else {
         output.print("00");
    }

      if (parts.length > 2) {
         switch (parts[2]) {
            case "A":
                 output.print("01");
                break;
           case "D":
               output.print("10");
               break;
         
       }
   } else {
         output.print("00");
    }

    output.println();
    if (parts.length > 3) {
        int number = Integer.parseInt(parts[3]);
        String binary = String.format("%8s", Integer.toBinaryString(number)).replace(' ', '0');
        output.println(binary);
    }

}

字符串

envsm3lx

envsm3lx1#

从根本上说,这些代码丢弃了有价值的信息。在确定操作码之后,该确定仅用于发出操作码本身,而不用于通知如何处理操作数。
通常,指令集架构具有 * 格式 *,并且每种格式都具有允许的特定数量和类型的操作数-每条指令将采用其中一种格式的形状。
所以,你可以做的是:

  • 设置一个变量,指示该操作码的格式,然后处理格式:
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.

相关问题