现在看看这个group的具体含义,先来看看group的表式怎么查看的:
首先是从opcode表中出发:
看看这个0x80编码的opcode,没有显示任何的指令,只是写了:
Immediate Grp 1(1A)
表示是立即数,属于group1的1A部分(看下面的图)
既然是属于group属性,那么就需要配合ModR/M来确定具体的操作指令是什么了: 查表: Opcode Extensions for One- and Two-byte Opcodes by Group Number
从以上的这两个表就可以确定具体的操作指令,然后综合这个指令的属性: Eb,Ib
就可以根据后面的ModR/M来最终知道是什么样的一个汇编指令了。
这个就是怎么查opcode表的一般方法了,呵呵,到这儿,我们已经基本上完成了对于intel指令的解析的基本知识的学习,总结一下: 首先我们从指令的顺序出发,先看了prefix;
然后继续查表,找到opcode对应的操作码,接下来就是查看这个操作码的属性:是否属于某一组,如果是,通过组找到具体的操作码;不是就继续看这个操作码的属性,是一个还是两个,来确定寻址方式,看是否需要依赖于ModR/M;
然后是根据ModR/M看是否需要使用SIB来扩展内存寻址方式,如果需要则根据SIB来确定这种寻址方式;
再然后就是,继续读机器码,根据前面opcode,ModR/M,SIB,将最后的DIS和IMM放入解码;
至此,机器码的反汇编就完成了。
第四节
在这一节中我将整合前面的三节内容来完成一个完整思路的反汇编引擎的设计思路。
由于前面的知识是一边学习一边记录的,所以整个思路看起来比较乱,但是从初学的角度说,这样有层次的学习是比较适合逐步理解的,可是最后能够总结精华并且加以应用才是我们的最终目的,所以在这一节中就会综合前面的知识,通过画框架的形式来总结内容,然后通过看egogg大大的文章和反汇编源代码来最终理解opcode!
现在开始吧!