Opcode1表我在word里面填充了一下,每个不同的颜色都需要不同的处理,在word里我只填充了Opcode1,其他表格我都是拿着不同颜色的笔在纸上画出来的,想学习就别偷懒,自己赶紧画一下吧。填充表格不是一天两天、一个星期两个星期能完成的,可能需要你一个月两个月。所以,想写引擎确实是个苦力活,不是编写的难点太多,而是难在太多简单却冗长的工作要做。
至于如何填表,我这里举上几例,如表格的第一项00,他是ADD指令,下标是Eb,Gb
E: A ModR/M byte follows the opcode and specifies the operand. Opcode后面跟着ModRM
G: The reg field of the ModR/M byte selects a general register. ModRM中的reg被用作选择通用寄存器
b: Byte, regardless of operand-size attribute.不管是否有66前缀操作数都只是一个字节
可见,E和G都说明这个指令需要ModRM,所以填充标志为ModRM。再来看一个8D,大家可以看官方手册《Volume 2B: Instruction Set Reference, N-Z》的Appendix A Opcode Map,即附录A,里面有所有的表。8D这条指令是LEA,下标是Gv,M,G我们已经知道了,说明这条指令肯定有ModRM,再来看M和v:
M:The ModR/M byte may refer only to memory (for example, BOUND, LES, LDS, LSS, LFS, LGS, CMPXCHG8B). ModRM只能用于内存操作数。
可见这个M里面还是有说道的,所以我们必须去查一下关于ModRM的说明。来到《Volume 2A:Instruction Set Reference, A-M》中的CHAPTER 2 INSTRUCTION FORMAT,即第2章看一下。