⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsasm_functions.cpp

📁 自己写的一个调试器模型的源码, 有单步功能和反汇编引擎.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                            
              wsprintf(assembly,"%s %s,st",FpuInstructions[REG],FpuRegs[reg1]);
            }
         }
         break;

         case 0xDD: // FPU Instruction
         {
             switch((BYTE)(*(*Opcode+Pos+1)))
             {             
                case 0xC0:case 0xC1:case 0xC2:case 0xC3: 
                case 0xC4:case 0xC5:case 0xC6:case 0xC7: 
                {
                   wsprintf(assembly,"ffree %s",FpuRegs[reg1]);
                }
                break;
                 
                case 0xC8:case 0xC9:case 0xCA:case 0xCB: 
                case 0xCC:case 0xCD:case 0xCE:case 0xCF: 
                {
                   lstrcat((*Disasm)->Remarks,"Invalid Instruction");
                   strcpy(assembly,"???");
                }
                break;
                 
                case 0xD0:case 0xD1:case 0xD2:case 0xD3: 
                case 0xD4:case 0xD5:case 0xD6:case 0xD7: 
                case 0xD8:case 0xD9:case 0xDA:case 0xDB: 
                case 0xDC:case 0xDD:case 0xDE:case 0xDF:
                {
                  wsprintf(assembly,"%s %s",FpuInstructionsSet2[REG],FpuRegs[reg1]);
                }
                break;

                case 0xE0:case 0xE1:case 0xE2:case 0xE3: 
                case 0xE4:case 0xE5:case 0xE6:case 0xE7: 
                {
                  wsprintf(assembly,"fucom %s",FpuRegs[reg1]);
                }
                break;
                
                case 0xE8:case 0xE9:case 0xEA:case 0xEB: 
                case 0xEC:case 0xED:case 0xEE:case 0xEF: 
                {
                  wsprintf(assembly,"fucomp %s",FpuRegs[reg1]);
                }
                break;

                case 0xF0:case 0xF1:case 0xF2:case 0xF3:  
                case 0xF4:case 0xF5:case 0xF6:case 0xF7: 
                case 0xF8:case 0xF9:case 0xFA:case 0xFB:  
                case 0xFC:case 0xFD:case 0xFE:case 0xFF: 
                {
                   wsprintf(assembly,"%s %s",FpuInstructionsSet3[REG],FpuRegs[reg1]);
                }
                break;                
             }             
         }
         break;

         case 0xDE: // FPU Instruction
         {
             switch((BYTE)(*(*Opcode+Pos+1)))
             {
                 case 0xC0:case 0xC1:case 0xC2:case 0xC3: 
                 case 0xC4:case 0xC5:case 0xC6:case 0xC7: 
                 {
                     wsprintf(assembly,"faddp %s,st",FpuRegs[reg2]);
                 }
                 break;
                 
                 case 0xC8:case 0xC9:case 0xCA:case 0xCB: 
                 case 0xCC:case 0xCD:case 0xCE:case 0xCF: 
                 {                     
                     wsprintf(assembly,"fmulp %s,st",FpuRegs[reg2]);
                 }
                 break;

                 case 0xD0:case 0xD1:case 0xD2:case 0xD3: 
                 case 0xD4:case 0xD5:case 0xD6:case 0xD7: 
                 {
                   wsprintf(assembly,"ficom %s",FpuRegs[reg2]);
                 }
                 break;

                 case 0xD8:case 0xD9:case 0xDA:case 0xDB: 
                 case 0xDC:case 0xDD:case 0xDE:case 0xDF:
                 {
                   wsprintf(assembly,"ficomp %s",FpuRegs[reg2]);
                 }
                 break;

                 case 0xE0:case 0xE1:case 0xE2:case 0xE3: 
                 case 0xE4:case 0xE5:case 0xE6:case 0xE7: 
                 {
                   wsprintf(assembly,"fsubrp %s,st",FpuRegs[reg2]);
                 }
                 break;

                 case 0xE9:
                 {
                     strcpy(assembly,"fcompp");
                 }
                 break;

                 case 0xE8:case 0xEA:case 0xEB: 
                 case 0xEC:case 0xED:case 0xEE:case 0xEF: 
                 {
                   wsprintf(assembly,"fsubp %s,st",FpuRegs[reg2]);
                 }
                 break;

                 case 0xF0:case 0xF1:case 0xF2:case 0xF3:  
                 case 0xF4:case 0xF5:case 0xF6:case 0xF7: 
                 {
                   wsprintf(assembly,"fdivrp %s,st",FpuRegs[reg2]);
                 }
                 break;

                 case 0xF8:case 0xF9:case 0xFA:case 0xFB:  
                 case 0xFC:case 0xFD:case 0xFE:case 0xFF: 
                 {
                   wsprintf(assembly,"fdivp %s,st",FpuRegs[reg2]);
                 }
                 break;
             }
         }
         break;

         case 0xDF: // FPU Instruction
         {
             switch((BYTE)(*(*Opcode+Pos+1)))
             {
                case 0xC0:case 0xC1:case 0xC2:case 0xC3: 
                case 0xC4:case 0xC5:case 0xC6:case 0xC7: 
                {
                   wsprintf(assembly,"ffreep %s",FpuRegs[reg2]);
                }
                break;
                     
                case 0xC8:case 0xC9:case 0xCA:case 0xCB: 
                case 0xCC:case 0xCD:case 0xCE:case 0xCF: 
                {                     
                   lstrcat((*Disasm)->Remarks,"Invalid Instruction");
                   strcpy(assembly,"???");
                }
                break;
                     
                case 0xD0:case 0xD1:case 0xD2:case 0xD3: 
                case 0xD4:case 0xD5:case 0xD6:case 0xD7: 
                {
                   wsprintf(assembly,"fist %s",FpuRegs[reg2]);
                }
                break;
                     
                case 0xD8:case 0xD9:case 0xDA:case 0xDB: 
                case 0xDC:case 0xDD:case 0xDE:case 0xDF:
                {
                  wsprintf(assembly,"fistp %s",FpuRegs[reg2]);
                }
                break;
                     
                case 0xE0:
                {
                    strcpy(assembly,"fnstsw ax");
                }
                break;

                case 0xE1:case 0xE2:case 0xE3: 
                case 0xE4:case 0xE5:case 0xE6:case 0xE7: 
                {
                  wsprintf(assembly,"fbld %s",FpuRegs[reg2]);
                }
                break;
                     
                case 0xE9:case 0xE8:case 0xEA:case 0xEB: 
                case 0xEC:case 0xED:case 0xEE:case 0xEF: 
                {
                   wsprintf(assembly,"fucomip st,%s",FpuRegs[reg2]);
                }
                break;
                     
                case 0xF0:case 0xF1:case 0xF2:case 0xF3:  
                case 0xF4:case 0xF5:case 0xF6:case 0xF7: 
                {
                  wsprintf(assembly,"fcomip st,%s",FpuRegs[reg2]);
                }
                break;
                     
                case 0xF8:case 0xF9:case 0xFA:case 0xFB:  
                case 0xFC:case 0xFD:case 0xFE:case 0xFF: 
                {
                  wsprintf(assembly,"fistp %s",FpuRegs[reg2]);
                }
                break;
            }
         }
         break;

         case 0xF6:
         {             
             if(reg1==0 || reg1==1)
             {
                 SwapWord((BYTE*)(*Opcode+Pos+1),&wOp,&wMem);
                 wsprintf(assembly,"%s %s,%02X",InstructionsSet2[REG],regs[RM][reg2],wOp&0x00FF);
                 (*(*index))++;
                 m_OpcodeSize++;
                 wsprintf(m_Bytes,"%02X",wOp&0x00FF);
                 lstrcat(temp,m_Bytes);
             }
             else
                 wsprintf(assembly,"%s %s",InstructionsSet2[REG],regs[RM][reg2]);
         }
         break;

         case 0xF7:
         {             
           if(reg1==0 || reg1==1)
           {
               if(!PrefixReg) // no 0x66 prefix used (read DWORD)
               {
                 SwapDword((BYTE*)(*Opcode+Pos+2),&dwOp,&dwMem);
                 wsprintf(assembly,"%s %s,%08X",InstructionsSet2[REG],regs[RM][reg2],dwMem);                 
                 wsprintf(m_Bytes," %08X",dwOp);
                  (*(*index))+=4; 
                  m_OpcodeSize+=4;
               }
               else // prefix 0x66 is being used (read WORD)
               {
                   SwapWord((BYTE*)(*Opcode+Pos+2),&wOp,&wMem);
                   wsprintf(assembly,"%s %s,%04X",InstructionsSet2[REG],regs[RM][reg2],wMem);                   
                   wsprintf(m_Bytes," %04X",wOp);                   
                   (*(*index))+=2;
                   m_OpcodeSize+=2;
               }
                          
             lstrcat(temp,m_Bytes);
           }
           else
               wsprintf(assembly,"%s %s",InstructionsSet2[REG],regs[RM][reg2]);
         }
         break;

         case 0xFE: // MIX Instructions (INC,DEC,INVALID,INVALID...)
         {
             wsprintf(assembly,"%s %s",InstructionsSet3[REG],regs[RM][reg2]);
             if(REG>1)
                 lstrcat((*Disasm)->Remarks,"Illegal Instruction");
         }
         break;
         
         case 0xFF:
         {
             wsprintf(assembly,"%s %s",InstructionsSet4[REG],regs[RM][reg2]);

             if(REG==7)
                 lstrcat((*Disasm)->Remarks,"Illegal Instruction");
         }
         break;

		 case 0x8D:{
			wsprintf(assembly,"%s %s, %s",instruction,regs[RM][reg2],regs[RM][reg1]);
			lstrcat((*Disasm)->Remarks,"Illegal Instruction");
		 }
		 break;
         
         // Default General Instructions
         default: wsprintf(assembly,"%s %s, %s",instruction,regs[RM][reg1],regs[RM][reg2]); break;
       }

       lstrcat((*Disasm)->Assembly,assembly);
       (*Disasm)->OpcodeSize=m_OpcodeSize;
       lstrcat((*Disasm)->Opcode,temp);

       (*(*index))+=IndexAdd;
       // strcpy(menemonic,assembly);
    }

    return; // RET
}

void Mod_RM_SIB(
		  DISASSEMBLY **Disasm,
		  char **Opcode, int pos, 
		  bool AddrPrefix,
		  int SEG,
		  DWORD **index,
		  BYTE Bit_d, 
		  BYTE Bit_w, 
		  char *instruction,
		  BYTE Op,
		  bool PrefixReg,
		  bool PrefixSeg,
		  bool PrefixAddr
		 )
{
    /*
        This Function will resolve BigSet menemonics: 
        ADC, ADD, AND, CMP, MOV, OR, SBB, SUB, XOR,ARPL, BOUND..
        We analyze the opcode using ;
        BitD, BitW,SIB ( SS III BBB : Sacle-Index-Base)
        MOD/RM
    */

	// Set Defaults    
    DWORD dwOp,dwMem;
	int RM=REG8,SCALE=0,SIB,ADDRM=REG32;
    WORD wOp,wMem;
    bool bound=0,UsesFPU=0;
    char RSize[10]="byte",Aritmathic[5]="+",tempAritmathic[5]="+";
	BYTE reg1=0,reg2=0,REG=0,Extension=0,FOpcode=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -