【问题标题】:Parsing hex into an LC3 ADD instruction [closed]将十六进制解析为 LC3 ADD 指令
【发布时间】:2015-04-16 00:10:20
【问题描述】:

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

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

LC3汇编语言中有两种ADDs:

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

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

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

【问题讨论】:

  • 作为初级程序员编写decompiler 不会是一件容易的事,事实上它会非常困难。而如何做到这一点也很大程度上取决于您要反编译的平台,因为某些架构具有可变大小的指令。
  • 你应该首先了解 I/O 功能,并用它做一些测试来学习它。拥有good reference 将在这里有所帮助。在尝试编写任何类型的大型或复杂程序之前,了解您正在编程的语言、库和平台也很好。然后,对于您的实际作业,您应该彻底阅读 CPU 架构的手册和文档,它们会告诉您说明中的每一点的含义。
  • 我们使用的微架构是 LC3,所有指令都设置为 16 位。谢谢你的快速反应。如果我遗漏了更多必要的信息,请告诉我。
  • 另外,我知道所有说明的含义。我已经研究微架构大约一个月了,并且玩过十六进制和汇编。我的问题不在于架构,而在于 C 中的 I/O。
  • 使用fopen 打开文件,fread 将文件读入内存(例如,读入uint16_t 的数组),并使用循环检查每条指令。没什么大不了的。

标签: c disassembly lc3


【解决方案1】:

我想知道我是否可以先得到一些帮助 函数:void printAdd(int指令);

好吧,函数本身已经假设您已经检测到操作码并相应地进行了分派,所以我们不需要在这里处理这部分。正如您所说,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);
    }
}

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

【讨论】:

  • 我的不完整回复的扩展:很好的回复,谢谢。我有一个关于您正在执行的二进制移位的后续问题。例如,假设我们有添加指令:0001 001 010 000 001。现在我知道我的解释方式一定有问题,所以请纠正我的错误:第一个格式化的十进制执行二进制右移9 上的指令,给我们:0001 001 & 0000 111 (7)。这不会返回零吗?它如何从中接收正确的寄存器?再次感谢您的回复!
  • 0001 001 & 0000 111 不是零,而是0000 001。用 7 掩码表示,保留低 3 位。当然,这可能会给你零,那就是编码一个有效的寄存器R0。但在这个例子中是R1
  • 谢谢小丑,帮我解决了:)
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2015-01-28
  • 2022-11-16
  • 2015-11-19
  • 2010-12-30
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多