📄 dsasm_functions.cpp
字号:
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 + -