2013-01-07 240 views
1

我需要像编码编码汇编指令操作码来

mov eax, edx 
inc edx 

几个指令到相应的操作码x86_64的。有没有任何库(不是一个完整的asm编译器)来轻松实现?

+1

你为什么不使用汇编程序? –

+0

你在做什么?为什么不简单地使用'nasm'或'gas'将它组装成字节码呢?但是,如果您想手动执行此操作,此参考可能会有所帮助,但请参阅http://ref.x86asm.net/coder64.html。 – RageD

+0

构建一个汇编程序需要几个月的时间,使用外部程序对我来说是一个不好的解决方案,因为我宁愿保持我的代码清晰,理解nasm的工作方式可能比编写我自己的汇编程序更差 –

回答

2

你可以采取开源FASMNASM并使用他们的解析器。

1

的情况下,你已经编译成二进制(从你的汇编或嵌入式汇编C):

objdump的-S​​ your_binary,它会列出其二进制代码的每个指令。

0

假设你只是在翻译简单的指令之后,编写一个简单的汇编器就不会有太多的工作。我之前就已经完成了它 - 你可能拥有大部分用于反汇编程序组件的逻辑和表格(比如指令名称和寄存器编号等名称的操作码表 - 只是反过来使用)。我不一定意味着你可以直接反过来使用表格,但是以适当的方式重新排列表格的内容应该能够完成大部分艰苦的工作。

困难的是符号和搬迁等等。但是因为你可能并不真的需要“找到这段代码”,所以我想你可以不用这些部分。您也不需要根据某些规范生成目标文件 - 只需要一组字节。现在

,它会得到一点点,如果你想找到更靠谱:

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

,因为你不得不编码跳跃到他们的相对位置 - 起码,它需要一个两遍的方法,首先确定指令的长度,然后是跳跃目标的实际填充。如果“someplace_else”远离跳跃本身,它也可能是绝对跳跃,在这种情况下,您的“搜索”将不得不承担与搜索位置相关的方式 - 因为该序列对于每个单一地址都是不同的。

我写了汇编程序和反汇编程序,如果你不需要处理可重定位的地址和文件格式以及你不知道的奇怪定义,那么这不是很难(直到你学习了200页格式的定义]。