关于浮点指令(8087)的编码规则

近日,在对一些样本进行OPCODE提取时,发现有一些样本调用了浮点指令,而现有的反汇编器并没有支持,所以需要加入对浮点指令的支持。但是在对浮点指令进行分类的时候遇到了些问题。

浮点指令按照功能划分大致可以分为:数据转移、算术运算和控制相关。但是这样的分类方式并不能方便地对其对应的机器码进行符合逻辑的分类,因为其一部分指令类似于X86指令集中的Group方式,而另一部分则类似于双字节指令。

如果按照操作数进行分类的话,则显得有条理的多。首先,浮点指令的OPCODE是由第一个字节(0xD8 – 0xDF)与后面的Mod/RM位字节中的Reg部分共同决定的,这样就契合了X86指令集中的Group扩展指令的形式。但是浮点指令集中此类指令只适用于操作数为地址的情况,也就是Mod部分不为11b的情况。而当Mod部分为11b的时候,其指令形式契合X86指令集中的双字节指令的形式。从而也就不需要分析Mod/RM位,每一个字节对应一个指令。

这样,对浮点指令的编码规则简单可以总结为:如果Mod部分不为11b,由Reg部分与第一个字节共同确定该机器码对应的OPCODE,否则,由第一和第二两个字节共同确定该机器码对应的OPCODE。