5、指令仿真
因为是采用标准C来实现指令仿真,所以有些标志位处理起来比较麻烦。
用内联汇编的方法实现指令很简单,没必要说什么。这里主要说下用C来实现实现指令模拟时会遇到的问题
a)AF位的处理。这个标志主要影响调整指令,比较麻烦,我的当前版本暂时回避了此标志,下个版本中将使用使用算法来解决此标志。
b)CF/OF位。由于暂时没有找到统一的处理办法,当前版本中,我是通过做有符号/无符号两种运算来分别设置的。
c)PF位。使用计算海明码码重的算法(LINUX源码中可以找到),起码比逐位遍历要高效不少
d) ModR/M SIB位。本部分一样是使用查表(参见IA32手册INSTRUCTION FORMAT部分)来完成解析的,解析结果是地址,保存到如下结构中
struct xxxxxxxxxxxxxxxxxxxxxx
{
/*
The total length of ModR/M、SIB(if exist) and Displacement(if exist).
Filled by GetInstructionArgs()
*/
UCHAR Length;
/*The reg field of the ModR/M byte*/
UCHAR Reg_Opcode;
/*The r/m field of the ModR/M byte*/
/*
Is EffectiveAddress a memory address or general register ?
1 -> Register. the RegIndex field is the index of the general register.
0 -> Memory address.
*/
UCHAR bIsEAReg;
union
{
UCHAR RegIndex;
ULONG Address;
}EffectiveAddress;