我是binutils开发的新手。我正在尝试添加一个带有两个操作数(大小,基本虚拟地址)的新自定义指令。我正在使用binutils 2.25。操作码长3个字节,我在x86机器上运行。这就是我做的:
enclsecreate,2,0x0f01cf,None,3,Cpu386,No_bSuf | No_wSuf | No_lSuf | No_sSuf | No_qSuf | No_ldSuf,{Reg64,Reg64}
我的理解,第二个操作数表示操作数的数量,后跟操作码,后跟无,后跟操作码中的字节数。
./ i386-gen --srcdir = 创建i386-tbl.h
i386-gen未构建,我使用make i386-gen构建,然后执行上述步骤。
为了能够使用反汇编程序,我们需要更新i386-dis.c.We需要在表中添加一个条目。我现在丢失了哪个表需要添加,因为有他们中的很多人并不了解他们的格式。
如果有人可以引导我完成我需要采取的进一步措施,或者指出一些包含必要信息的文件,那就太棒了。希望得到你的帮助。
由于
答案 0 :(得分:1)
您可以显示此指令的实际编码,因为它尚未在官方英特尔指令集参考中(2015年1月版)。 我觉得很奇怪,你说它有2个操作数,因为我没有看到编码它们的地方(也许它们是隐含的)。所以我只假设以下没有操作数。
i386-dis.c
顶部的评论说:
/ *描述说明的主表基本上是副本
英特尔80386的“操作码映射”章节(附录A) 程序员手册。通常,有一个大写字母,然后是 一封小信。大写字母表示寻址模式,
小写字母讲述了操作数的大小。参考 英特尔手册了解详情。 * /
您的操作码手册的适用表格是表A-6。按组编号分配单字节和双字节操作码的操作码扩展。如果您有更新的副本,则应在0F 01 11B
行001
列中找到您的说明,其中{3}位为(111)
。这当然是CF
的细分。
binutils的第一件事是0F 01
组和001
列。这意味着您必须编辑表RM_0F01_REG_1
。它按照低位的顺序列出了8个可能的指令。我的副本目前分别为monitor
和mwait
000
和001
。你也可能有其他人。由于我们的新指令的低3位是111
,它是十进制的7
,它必须进入该表的最后一个插槽。根据需要用Bad_Opcode
填充表格,然后插入新条目。
如果需要对操作数进行特殊解码,可以添加一个新函数来处理它。使用现有的(例如OP_Monitor
)作为模板。顺便说一下,它也是查找所需表的简单方法:只需查找与新指令位于同一编码组中的现有指令。
Disassembly of section .text:
0000000000000000 <.text>:
0: 0f 01 cf enclsecreate
是的,成功!