将十六进制代码格式化为asm代码

Formatting hex code to asm code

本文关键字:代码 asm 格式化 十六进制      更新时间:2023-10-16

我需要写一些类似于"反汇编器"的东西,我需要读取RAM内存(代码部分)并显示其格式为

ADD rax, rbx
MOV rcx, rax

我在哪里可以找到关于如何将操作码转换为相应的操作数的综合指南/论文?我的目标是x64汇编

您可以看看这个库-您可以"原样"使用它,或者只是从它的源代码(在BSD许可下发布)中学习。

我强烈建议您使用BSD许可的udis86库,而不是编写另一个x86反汇编程序:

#include <stdio.h>
#include <udis86.h>
enum {
    /* Controls whether to disassemble for x86 or x64 */
    UDIS86_MODE = 64 /* 16, 32, or 64 */
};
int main()
{
    ud_t ud_obj;
    ud_init(&ud_obj);
    ud_set_input_file(&ud_obj, stdin);
    ud_set_mode(&ud_obj, UDIS86_MODE);
    ud_set_syntax(&ud_obj, UD_SYN_INTEL);
    while (ud_disassemble(&ud_obj)) {
        printf("t%sn", ud_insn_asm(&ud_obj));
    }
    return 0;
}

github上的Udis86版本甚至支持最新的Intel AVX指令。

使用MinGW64/MSYS工具链可以很容易地为x86或x64 Windows构建Udis86。为了防止您不熟悉GCC和GNU autotools构建系统,我构建了:
  1. http://scottt.tw/mingw32-udis86.tar.gz
  2. http://scottt.tw/mingw64-udis86.tar.gz

为您的方便。归档文件包含DLL和头文件。(下载和运行随机陌生人在Stackoverflow上回答问题的dll是否明智是另一回事;)。

这是我的操作码列表,按数字排序:

http://ref.x86asm.net/geek64.html

该网站还有许多其他列表。但是,正如您所看到的,在x86/64上有相当多的操作码,因此手工编写反汇编程序需要一些时间。

我建议您将代码提供给现有的反汇编器。例如,请看这个问题:

如何反汇编原始的x86代码?

  1. 对于Intel,您可以在http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html找到它-特别是,您可能对第2卷感兴趣。

  2. 对于AMD处理器,必须在这里:http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/#manuals。看来你需要第三卷了

尽管如此,他们还是有很多共同点。

如果您正在创建您自己的反汇编器,那么您必须从……下载指令集指南(第二卷)

http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

附录中的注释和表格是无价的。您可能会注意到,许多指令都遵循类似的模式。因此,您可以构建自己的函数指针表来解码指令。填充表可能非常耗时。