【发布时间】:2013-12-06 05:39:48
【问题描述】:
我使用 llvm-mc 的目标是制作一个相对智能的反汇编程序(识别和跟踪本地人,轻松跟踪分支等),其中一部分是创建反汇编指令的字符串表示形式。
当我开始这个时,我希望我能够相对容易地识别MCInsts 使用的寄存器和值,并自己制作另一个我可以轻松使用的表示。但是,经过一番调查,我意识到,以指令的文本表示形式显示的操作数与 MCInst 对象中实际存在的操作数之间的相关性相当低。以下是一些示例(英特尔语法):
- 将 11587 作为 32 位立即数移动到
eax将使用MOV32ri操作码完成。文本表示将是mov eax, 11587。对应的MCInst将有两个操作数,一个寄存器和一个立即数。这对我有用。这很棒。 - 将
11587添加到eax将使用ADD32ri操作码完成。文本表示为add eax, 11587。但是,这一次,对应的MCInst有三个 操作数:eax有两次,最后是立即数。这不是很好。我可以假设这是降低过程的产物,eax的第一个实例是目标寄存器,第二个是源寄存器(即使 x86 不区分两者),我可以解决这个问题。 - 将 32 位
eip相对值移动到eax将使用MOV32ao32操作码完成。文本表示为mov eax, dword ptr [11587]。在这种情况下,MCInst甚至没有eax的操作数,它只能从操作码名称中存在的操作数类型推断出来。我也可以解决这个问题,但事情变得越来越不漂亮,我只测试了 x86 支持的 1300+ 中的 5-6 种不同的指令。
显然,出于显示文本的目的,我可以使用MCInstPrinter 获得文本表示,但是那里显示的内容与MCInst 所拥有的内容之间的映射仍然很模糊。
有没有一种直接的方法来判断哪些操作数出现在指令的文本表示中?
【问题讨论】: