向binutils 2.25添加新指令

时间:2015-03-09 17:07:56

标签: c x86 binutils

我是binutils开发的新手。我正在尝试添加一个带有两个操作数(大小,基本虚拟地址)的新自定义指令。我正在使用binutils 2.25。操作码长3个字节,我在x86机器上运行。这就是我做的:

  1. 使用i386-opc.tbl添加条目如下。
  2. enclsecreate,2,0x0f01cf,None,3,Cpu386,No_bSuf | No_wSuf | No_lSuf | No_sSuf | No_qSuf | No_ldSuf,{Reg64,Reg64}

    我的理解,第二个操作数表示操作数的数量,后跟操作码,后跟无,后跟操作码中的字节数。

    1. 使用i386-gen:
    2. ./ i386-gen --srcdir = 创建i386-tbl.h

      1. i386-gen未构建,我使用make i386-gen构建,然后执行上述步骤。

      2. 为了能够使用反汇编程序,我们需要更新i386-dis.c.We需要在表中添加一个条目。我现在丢失了哪个表需要添加,因为有他们中的很多人并不了解他们的格式。

      3. 如果有人可以引导我完成我需要采取的进一步措施,或者指出一些包含必要信息的文件,那就太棒了。希望得到你的帮助。

        由于

1 个答案:

答案 0 :(得分:1)

您可以显示此指令的实际编码,因为它尚未在官方英特尔指令集参考中(2015年1月版)。 我觉得很奇怪,你说它有2个操作数,因为我没有看到编码它们的地方(也许它们是隐含的)。所以我只假设以下没有操作数。

i386-dis.c顶部的评论说:

  

/ *描述说明的主表基本上是副本
  英特尔80386的“操作码映射”章节(附录A)   程序员手册。通常,有一个大写字母,然后是   一封小信。大写字母表示寻址模式,
  小写字母讲述了操作数的大小。参考   英特尔手册了解详情。 * /

您的操作码手册的适用表格是表A-6。按组编号分配单字节和双字节操作码的操作码扩展。如果您有更新的副本,则应在0F 01 11B001列中找到您的说明,其中{3}位为(111)。这当然是CF的细分。

binutils的第一件事是0F 01组和001列。这意味着您必须编辑表RM_0F01_REG_1。它按照低位的顺序列出了8个可能的指令。我的副本目前分别为monitormwait 000001。你也可能有其他人。由于我们的新指令的低3位是111,它是十进制的7,它必须进入该表的最后一个插槽。根据需要用Bad_Opcode填充表格,然后插入新条目。

如果需要对操作数进行特殊解码,可以添加一个新函数来处理它。使用现有的(例如OP_Monitor)作为模板。顺便说一下,它也是查找所需表的简单方法:只需查找与新指令位于同一编码组中的现有指令。

Disassembly of section .text:

0000000000000000 <.text>:
   0:   0f 01 cf                enclsecreate

是的,成功!