1

我需要编码一些指令,比如

mov eax, edx
inc edx

到相应的 x86_64 操作码。是否有任何库(不是整个 asm 编译器)可以轻松完成此任务?

4

3 回答 3

2

您可以采用开源FASMNASM并使用它们的解析器。

于 2013-01-07T18:34:35.773 回答
1

如果您已经将其编译为二进制文件(来自您的 asm 或带有嵌入式 asm 的 c):

objdump -S your_binary,它将列出每条指令及其二进制代码。

于 2013-01-07T18:41:46.457 回答
0

假设您只是在翻译简单的指令之后,编写一个简单的汇编程序不会有那么多工作。我以前做过 - 你可能有你的反汇编组件的大部分逻辑和表格(例如指令名称的操作码表和名称的寄存器编号 - 只需反过来使用它)。我并不一定意味着您可以直接反向使用表格,但是以合适的方式重新排列表格的内容应该可以完成大部分艰苦的工作并不算太糟糕。

变得困难的是符号和搬迁之类的东西。但是由于您可能并不真正需要“查找此代码序列”,因此我想您可以不使用这些部分。您也不需要生成符合某些规范的目标文件 - 您只需要一组字节。

现在,如果你想找到它会变得有点棘手:

here:
     inc eax
     jnz here
     jmp someplace_else
....
...
someplace_else:
     ....

因为您必须将跳转编码到它们的相对位置 - 至少,它需要两遍方法,首先计算指令的长度,然后实际填充跳转目标。如果“someplace_else”远离跳转本身,它也可能是绝对跳转,在这种情况下,您的“搜索”必须了解它与正在搜索的位置之间的关系 - 因为每个地址的顺序都不同.

我已经编写了汇编程序和反汇编程序,如果您不必处理具有您不知道的奇怪定义的可重定位地址和文件格式,这并不难[直到您研究了格式的 200 页定义]。

于 2013-01-07T20:43:10.483 回答