【问题标题】:How to get assembly instructions or mnemonics from the opcode/machine code? [closed]如何从操作码/机器码中获取汇编指令或助记符? [关闭]
【发布时间】:2016-04-02 10:04:11
【问题描述】:

我有一个使用 gcc 编译的简单 c 程序的二进制文件。 我正在编写自己的反汇编程序,我能够从 ELF 文件中读取 ELF 标头和其他标头。

我正在从 ELF 二进制文件中读取“.text”部分。并尝试将操作码转换为助记符/汇编指令。

如何将原始操作码/机器码转换为助记符/汇编指令?? C源代码为:

#include <stdio.h>

int main()
{
  int i = 10;
  int j = 22 + i;

  return 0;
}

以下是我在读取 ELF 文件后收到的原始操作码示例:

55 ffffff89 ffffffe5 ffffff83 ffffffec 20 ffffffc7 45 ffffffec 3 ffffffc7 45
fffffff0 41 ffffffc7 45 fffffff4 8 ffffffc7 45 fffffff8 21 ffffff8b 45
ffffffec ffffff83 ffffffc0 16 ffffff89 45 fffffffc ffffffb8 ffffffc9 ffffffc3

【问题讨论】:

  • 您的反汇编程序可能需要包含所有操作码的列表以及它们对应的指令,并且还必须解析所有前缀以及 ModR/M 和 SIB 字节。你可以在Intel's manuals找到所有这些信息。
  • 您需要修复您的代码,使其在打印之前不会将 8 位值符号扩展为 32 位。
  • 使用unsigned char读取操作码值,并使用%02x打印。
  • 我投票结束这个过于宽泛,因为问题询问如何编写反汇编程序而不显示任何努力。 (OP is already knowledgeable of objdump)
  • 您使用免费提供的英特尔指令参考。

标签: c linux assembly opcode


【解决方案1】:

如果您安装了 GNU binutils(您可能已经安装),您可以使用

objdump --disassemble elf-file

如果问题是“我为什么要得到那些 ffffff 数字”,那么您需要向我们展示产生这些数字的代码。很可能您遇到了从有符号字符到 int 的符号扩展问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2016-08-02
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多