编辑: 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: );

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题