【问题标题】:How to turn machine code into binary executable?如何将机器代码转换为二进制可执行文件?
【发布时间】:2016-05-03 01:59:09
【问题描述】:

我正在编写一个非常小的 x86 汇编器,它当前输出十六进制(或二进制,更改它是微不足道的)机器代码。如何将此十六进制/二进制文件写入我可以实际执行的文件中?

对于一个简单的输入,例如:

mov ax, #1
ret

汇编器会输出:

66b80100
c3

【问题讨论】:

  • 您需要了解您使用的平台所需的可执行文件格式的结构,并以这种格式创建文件。它将包含的内容之一是您组装的机器指令。
  • 您还有另一个主要选择:您是编写目标文件并将它们与现有链接器链接,还是编写自己的链接器(或将链接器的功能集成到汇编器中,可能将程序限制为单个源文件?)
  • 更改汇编器的输出,使其输出类似于DB 066h, 0b8h, 001h, 000h.byte 0x66, 0xb8, 0x01, 0x00 的内容,然后使用 MASM 或 GNU 汇编器等汇编器进行汇编,然后链接生成的目标文件以创建可执行文件.
  • @RossRidge 该标题是什么文件格式?
  • 参见this article / tutorial 了解如何制作微型可执行文件。目标不同,但它引入了可执行文件结构的概念。在您的情况下,DOS COM 文件几乎是(或字面意思?)平面二进制文件,没有加载到内存中并运行的元数据。所有其他可执行文件格式都有标题。

标签: assembly compilation compiler-construction linker x86


【解决方案1】:

要将十六进制值附加到 C++ 中的二进制文件,您必须将其表示为原始 int 值并将其写入文件。

因此:

void writeHexStringToFile(string hex, ofstream& file) {
    vector<string> hexBytes = hexBytesFromString(hex);
    for (unsigned i = 0; i < hexBytes.size(); i++) {
        istringstream buff(hexBytes.at(i));
        int hexVal;
        buff >> hex >> hexVal;
        file.write(reinterpret_cast<char*>(&hexVal), sizeof(int));
    }
}

【讨论】:

    【解决方案2】:

    在这种情况下,您可以使用比 C++ 更简单的 python,在底层不需要任何其他强大的东西。

    import sys
    string = open(sys.argv[1],'r').read()
    sys.stdout.write(string.decode("hex"))
    

    将其放入 .py 文件并使用 python file.py [file with hex] 运行它

    但首先要替换换行符。你可以使用

    cat file.hex | tr -d '\n' > file2.hex
    

    或者蟒蛇

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多