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

Parsing hex into an LC3 ADD instruction

我正在用 C 编写程序,将为 the LC3 processor 编译的十六进制文件转换回汇编语言。

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

LC3汇编语言中有两种ADD

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

该函数应根据需要对两者进行解码。

I was wondering if I could just have some help with this first 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);
    }
}

立即数的符号扩展留作练习 ;)