我对二进制程序的开发很陌生。我正在尝试添加一个新的自定义指令,它需要两个操作数(大小、基本虚拟地址)。我使用的是binutils 2.25。操作码有3字节长,我正在x86 machine.Here上运行它:
分泌型,2,0x0f01cf,None,3,No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf,{Reg64,Reg64}
我的理解是,第二个操作数说明操作数,然后是操作码,后面是零,后面是操作码中的字节数。
./i 386-gen --srcdir=创建i 386-tbl.h
如果有人能指导我完成我需要采取的进一步步骤,或者告诉我一些包含必要的information.Looking的文档,那就太好了。
谢谢
发布于 2015-03-10 19:25:51
您可以在正式的英特尔指令集参考(2015年1月版本)中显示该指令的实际编码。我觉得奇怪的是,您说它有两个操作数,因为我看不到编码它们的位置(也许它们是隐式的)。因此,我只是假设下面没有操作数。
i386-dis.c顶部的评论说:
/*描述指令的主表实质上是一个副本 英特尔80386的"Opcode Map“一章(附录A) 程序员手册。通常,后面有大写字母 用一个小字母写的。大写字母告诉寻址方式, 小字母告诉我们操作数的大小。有关详细信息,请参阅英特尔手册。*/
操作码手册中适用的表格是表A-6.按组号计算的单字节和双字节Opcode的Opcode扩展。如果您有一个更新的副本,您应该在0F 01 11B行中找到您的指令,列为001,其中包含低3位的(111)。这当然是CF的故障。
绑定的第一件事是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耶,成功!
https://stackoverflow.com/questions/28947831
复制相似问题