将十六进制解析为LC3 ADD指令

时间:2015-04-16 00:10:20

标签: c disassembly lc3

我正在用C语言编写一个程序,将为the LC3 processor编译的hex文件转换回汇编语言。

目前,我正在尝试解码ADD指令。

LC3汇编语言中有两种类型的ADD

  • 按引用添加:添加两个寄存器
  • 立即添加:将记录添加到硬编码值

例如,十六进制代码164F将转换为:ADD R3, R1, R7。这是一个参考添加。相反,153F的十六进制代码将转换为:ADD R2, R4, #-1。这是一个立即添加。

该功能应该适当地解码。

1 个答案:

答案 0 :(得分:4)

  

我想知道我是否可以先得到一些帮助   function:void printAdd(int instruction);

嗯,函数本身已经假定你已经检测到操作码并相应地发送了,所以我们不需要在这里处理那部分。正如您所说,ADD指令有两种形式。指令集引用将其结构显示为:

ADD DR, SR1, SR2 = 0001 DR SR1 0 0 0 SR2
ADD DR, SR, IMM5 = 0001 DR SR  1 IMM5

这意味着第5位区分两个版本。你需要在那个位上进行分支。除此之外,提取数字只是有点麻烦,简单的printf,我希望你知道如何使用。类似的东西:

void printAdd(int instruction)
{
    printf("ADD R%d, R%d, ", (instruction >> 9) & 7, (instruction >> 6) & 7);
    if (instruction & 0x20)
    {
        printf("#%d\n", instruction & 0x1F);
    } else {
        printf("R%d\n", instruction & 7);
    }
}

将立即符号扩展为练习;)