编辑: 865397499 | 2019-07-06 |
//反汇编函数声明 int main(int argc, char* argv[]) { return 0;
} char * DisAsm(char *Code, PInstr pinstr, char * stinstr)//反汇编函数 { char prefix[30]存储前缀结果 char mnem[30]全写是 mnemonic, 存储汇编指令助记符,例如:mov、add char operand1[30]operand2[30]operand3[30]存储操作数 1, 2,
3 字符串 int preFlag = 0;
char *currCode = Code;
//初始化指令前缀数组索引 pinstr->
RepPre = pinstr->
SegPre = pinstr->
OperPre = pinstr->
AddrPre = -1;
//循环解析前缀 while(*currCode == 0xF0 || *currCode == 0xF2 || *currCode == 0xF3 || *currCode == 0x2E || *currCode == 0x36 || *currCode == 0x3E || *currCode == 0x26 || *currCode == 0x64 || *currCode == 0x65 || *currCode == 0x66 || *currCode == 0x67)//可以用一个数组遍历判断,这里是一个 一个比对 { switch(*currCode) { /*加锁和重复前缀*/ case 0xF0: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix lock: );
currCode++;
return currCode;
} else { if(pinstr->
RepPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
RepPre = 0;
currCode++;
} } } break;
case 0xF2: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix repnz: );
currCode++;
return currCode;
} else { if(pinstr->
RepPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
RepPre = 5;
currCode++;
} } } break;
case 0xF3: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix rep: );
currCode++;
return currCode;
} else { if(pinstr->
RepPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
RepPre = 1;
currCode++;
} } } break;
/*段改写前缀*/ case 0x2E: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix cs: );
currCode++;
return currCode;
} else { if(pinstr->
SegPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
SegPre = 1;
currCode++;
} } } break;
case 0x36: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix ss: );
currCode++;
return currCode;
} else { if(pinstr->
SegPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
SegPre = 2;
currCode++;
} } } break;
case 0x3E: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix ds: );
currCode++;
return currCode;
} else { if(pinstr->
SegPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
SegPre = 3;
currCode++;
} } } break;
case 0x26: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix es: );
currCode++;
return currCode;
} else { if(pinstr->
SegPre >
= 0)//出现连续同组后缀 { currCode = Code;
//重解析 preFlag = 1;
} else//第一次出现该组后缀 { pinstr->
SegPre = 0;
currCode++;
} } } break;
case 0x64: { if(preFlag)//重解析将到这里,单独输出第一个连续同组后缀 { strcpy(stinstr, prefix fs: );