首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向binutils 2.25添加新指令

向binutils 2.25添加新指令
EN

Stack Overflow用户
提问于 2015-03-09 17:07:55
回答 1查看 436关注 0票数 2

我对二进制程序的开发很陌生。我正在尝试添加一个新的自定义指令,它需要两个操作数(大小、基本虚拟地址)。我使用的是binutils 2.25。操作码有3字节长,我正在x86 machine.Here上运行它:

  1. 使用i 386-opc.tbl添加条目,如下所示。

分泌型,2,0x0f01cf,None,3,No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf,{Reg64,Reg64}

我的理解是,第二个操作数说明操作数,然后是操作码,后面是零,后面是操作码中的字节数。

  1. 使用i 386-gen:

./i 386-gen --srcdir=创建i 386-tbl.h

  1. I 386-gen不是构建的,我使用make 386-gen构建,然后运行上述步骤。
  2. 为了能够使用反汇编程序,我们需要更新i 386-dis.c。我们需要在表中添加一个条目,我现在不知道我需要添加哪个表,因为有那么多表,而且我不理解它们的格式。

如果有人能指导我完成我需要采取的进一步步骤,或者告诉我一些包含必要的information.Looking的文档,那就太好了。

谢谢

EN

回答 1

Stack Overflow用户

发布于 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种可能的指令,按它们的低位排列。我的副本目前在那里有monitormwait,分别用于000001。你可能也有其他人。由于我们的新指令的低3位是111 (十进制中的7 ),所以它必须放在那个表的最后一个位置。必要时用Bad_Opcode填充表,然后插入新条目。

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

代码语言:javascript
复制
Disassembly of section .text:

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

耶,成功!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28947831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档