📄 armdasm.cpp
字号:
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d], +r%d, lsr #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opptrpar(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d], +r%d, asr #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opptrprr(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
(tmp4)?
sprintf(dout,"r%d, [r%d], +r%d, ror #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4):
sprintf(dout,"r%d, [r%d], +r%d, rrx", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
// Load/store miscellaneous (halfword-style)
void ARMDasm::oplmofim(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #-$%1X%1X]", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}
void ARMDasm::oplmofip(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #+$%1X%1X]", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}
void ARMDasm::oplmprim(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #-$%1X%1X]!", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}
void ARMDasm::oplmprip(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #+$%1X%1X]!", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}
void ARMDasm::oplmptim(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d], #-$%1X%1X", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}
void ARMDasm::oplmptip(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d], #+$%1X%1X", DASMOP_RD, DASMOP_RN, DASMOP_RS, DASMOP_RM);
}
// Load/store multiple
// ACK: Costis (LDM disassembly algorithm, original)
void ARMDasm::oplm(u32 op, u32 r15)
{
int i, b_start, b_end, inWord=op;
char str[520],regstr[512];
sprintf(str,"r%d",DASMOP_RN);
if(op&0x00200000) sprintf(str,"%s!",str);
sprintf(regstr,",{");
b_start = b_end = -1;
for (i = 0; i <= 16; i++)
{
if ((inWord & 1) && (b_start < 0)) { if(i<16) b_start = i; }
else if (!(inWord & 1))
{
b_end = i - 1;
if (b_start >= 0)
{
if(strlen(regstr)==2)
{
if(b_start!=b_end) sprintf(regstr, "%sr%d-r%d", regstr, b_start, b_end);
else sprintf(regstr, "%sr%d", regstr, b_start);
} else {
if(b_start!=b_end) sprintf(regstr, "%s,r%d-r%d", regstr, b_start, b_end);
else sprintf(regstr, "%s,r%d", regstr, b_start);
}
}
b_start = -1;
}
inWord >>= 1;
}
sprintf(str,"%s%s}",str,regstr);
if(op&0x00400000) sprintf(str,"%s^",str);
sprintf(dout,"%s",str);
}
// MSR/MRS
void ARMDasm::opmrsrs(u32 op, u32 r15)
{
sprintf(dout,"r%d, cpsr",DASMOP_RD);
}
void ARMDasm::opmrsrc(u32 op, u32 r15)
{
sprintf(dout,"r%d, spsr",DASMOP_RD);
}
void ARMDasm::opmsric(u32 op, u32 r15)
{
tmp3 = op&255;
tmp4 = (op&0x00000F00)>>7;
tmp1 = (tmp3>>tmp4)|((tmp3&((1<<tmp4)-1))<<(32-tmp4));
sprintf(dout,"cpsr_%c%c%c%c, #%08X",
((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), tmp1);
}
void ARMDasm::opmsris(u32 op, u32 r15)
{
tmp3 = op&255;
tmp4 = (op&0x00000F00)>>7;
tmp1 = (tmp3>>tmp4)|((tmp3&((1<<tmp4)-1))<<(32-tmp4));
sprintf(dout,"spsr_%c%c%c%c, #%08X",
((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), tmp1);
}
void ARMDasm::opmsrrc(u32 op, u32 r15)
{
sprintf(dout,"cpsr_%c%c%c%c, r%d",
((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), DASMOP_RM);
}
void ARMDasm::opmsrrs(u32 op, u32 r15)
{
sprintf(dout,"spsr_%c%c%c%c, r%d",
((op&0x00010000)?'c':'_'), ((op&0x00020000)?'x':'_'),
((op&0x00040000)?'s':'_'), ((op&0x00080000)?'f':'_'), DASMOP_RM);
}
// Swap
void ARMDasm::opswp(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, [r%d]",DASMOP_RD,DASMOP_RM,DASMOP_RN);
}
void ARMDasm::opswi(u32 op, u32 r15)
{
sprintf(dout,"$%06X",op&0x00FFFFFF);
}
// Multiply
void ARMDasm::opmul(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d",DASMOP_RN,DASMOP_RM,DASMOP_RS);
}
void ARMDasm::opmla(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d, r%d",DASMOP_RN,DASMOP_RM,DASMOP_RS,DASMOP_RD);
}
void ARMDasm::opmull(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d, r%d",DASMOP_RD,DASMOP_RN,DASMOP_RM,DASMOP_RS);
}
// Coprocessors
void ARMDasm::opmcr(u32 op, u32 r15)
{
sprintf(dout,"p%d, %1X, r%d, c%d, c%d, %1X",DASMOP_RS,DASMOP_RO>>1,DASMOP_RD,DASMOP_RN,DASMOP_RM,DASMOP_RP>>1);
}
void ARMDasm::opcpd(u32 op, u32 r15)
{
sprintf(dout,"p%d, %1X, c%d, c%d, c%d, %1X",DASMOP_RS,DASMOP_RO>>1,DASMOP_RD,DASMOP_RN,DASMOP_RM,DASMOP_RP>>1);
}
// Enhanced DSP QADD
void ARMDasm::opqadd(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d", DASMOP_RD, DASMOP_RM, DASMOP_RN);
}
// CLZ
void ARMDasm::opclz(u32 op, u32 r15)
{
sprintf(dout, "r%d, r%d", DASMOP_RD, DASMOP_RM);
}
//---Thumb disasms---------------------------------------------------------
void ARMDasm::topimm5(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #$%02X",TDASMOP_RD,TDASMOP_RN,TDASMOP_IMM5);
}
void ARMDasm::topimm5shft(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, #$%02X",TDASMOP_RD,TDASMOP_RN,TDASMOP_IMM5);
}
void ARMDasm::topimm7(u32 op, u32 r15)
{
if(op&0x0080) sprintf(dout,"SUB sp, sp, #$%02X",TDASMOP_IMM7);
else sprintf(dout,"ADD sp, sp, #$%02X",TDASMOP_IMM7);
}
void ARMDasm::topimm8(u32 op, u32 r15)
{
sprintf(dout,"r%d, #$%02X",TDASMOP_RS, TDASMOP_IMM8);
}
void ARMDasm::topimm3(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, #$%01X",TDASMOP_RD,TDASMOP_RN,TDASMOP_RM);
}
void ARMDasm::topb(u32 op, u32 r15)
{
signed int b = (op&0x0400)?(0xFFFFFC00|(op&0x03FF))
:(op&0x03FF);
sprintf(dout,"$%08X",r15+4+(b*2));
}
void ARMDasm::topbx(u32 op, u32 r15)
{
if(op&0x0080)
sprintf(dout,"BLX r%d",TDASMOP_RNH);
else
sprintf(dout,"BX r%d",TDASMOP_RNH);
}
void ARMDasm::topbl1(u32 op, u32 r15)
{
tmp4=(TDASMOP_IMM11)<<12; tmp4=(tmp4&0x400000)?(0xFF800000|tmp4):tmp4; tmp4+=r15; tmp4+=4;
sprintf(dout,";Long branch");
}
void ARMDasm::topbl2(u32 op, u32 r15)
{
tmp4 += TDASMOP_IMM11*2;
sprintf(dout,"$%08X", tmp4);
}
void ARMDasm::topbc(u32 op, u32 r15)
{
signed int b = (op&0x0080)?(0xFFFFFF00|(op&0x00FF))
:(op&0x00FF);
sprintf(dout,"$%08X",r15+4+(b*2));
}
void ARMDasm::toph(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d",TDASMOP_RDH,TDASMOP_RNH);
}
void ARMDasm::topldm(u32 op, u32 r15)
{
int i, b_start, b_end, inWord=op;
char str[512];
sprintf(str,"{");
b_start = b_end = -1;
for (i = 0; i <= 8; i++)
{
if ((inWord & 1) && (b_start < 0)) { if(i<8) b_start = i; }
else if (!(inWord & 1))
{
b_end = i - 1;
if (b_start >= 0)
{
if(strlen(str)==1)
{
if (b_start != b_end) sprintf (str, "%sr%d-r%d", str, b_start, b_end);
else sprintf (str, "%sr%d", str, b_start);
} else {
if (b_start != b_end) sprintf (str, "%s,r%d-r%d", str, b_start, b_end);
else sprintf (str, "%s,r%d", str, b_start);
}
}
b_start = -1;
}
inWord >>= 1;
}
sprintf(dout,"%s}",str);
}
void ARMDasm::topdp1(u32 op, u32 r15)
{
switch((op&0x00C0)>>6)
{
case 0: sprintf(dout,"AND r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 1: sprintf(dout,"EOR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 2: sprintf(dout,"LSL r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 3: sprintf(dout,"LSR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
}
}
void ARMDasm::topdp2(u32 op, u32 r15)
{
switch((op&0x00C0)>>6)
{
case 0: sprintf(dout,"ASR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 1: sprintf(dout,"ADC r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 2: sprintf(dout,"SBC r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 3: sprintf(dout,"ROR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
}
}
void ARMDasm::topdp3(u32 op, u32 r15)
{
switch((op&0x00C0)>>6)
{
case 0: sprintf(dout,"TST r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 1: sprintf(dout,"NEG r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 2: sprintf(dout,"CMP r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 3: sprintf(dout,"CMN r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
}
}
void ARMDasm::topdp4(u32 op, u32 r15)
{
switch((op&0x00C0)>>6)
{
case 0: sprintf(dout,"ORR r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 1: sprintf(dout,"MUL r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 2: sprintf(dout,"BIC r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
case 3: sprintf(dout,"MVN r%d, r%d",TDASMOP_RD,TDASMOP_RN); break;
}
}
void ARMDasm::topreg(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d",TDASMOP_RD,TDASMOP_RN);
}
void ARMDasm::topund(u32 op, u32 r15)
{
sprintf(dout,"<unknown>");
}
void ARMDasm::toppc(u32 op, u32 r15)
{
sprintf(dout,"=$%08X",rdW(r15+(TDASMOP_IMM8<<2)+4));
}
void ARMDasm::topsp(u32 op, u32 r15)
{
sprintf(dout,"[sp, #$%02X*4]",TDASMOP_IMM8);
}
void ARMDasm::topbkpt(u32 op, u32 r15)
{
sprintf(dout,"<unimpl>");
}
void ARMDasm::topswi(u32 op, u32 r15)
{
sprintf(dout,"$%02X",op&0x00FF);
}
//---Tables----------------------------------------------------------------
const char *ARMDasm::condstr[]={
"eq","ne","cs","cc",
"mi","pl","vs","vc",
"hi","ls","ge","lt",
"gt","le","","nv",
};
const ARMDasm::DASMOP ARMDasm::ops[]={
//0x00
{"and%s %s", ARMDasm::oplli },
{"and%s %s", ARMDasm::opllr },
{"and%s %s", ARMDasm::oplri },
{"and%s %s", ARMDasm::oplrr },
{"and%s %s", ARMDasm::opari },
{"and%s %s", ARMDasm::oparr },
{"and%s %s", ARMDasm::oprri },
{"and%s %s", ARMDasm::oprrr },
{"and%s %s", ARMDasm::oplli },
{"mul%s %s", ARMDasm::opmul },
{"and%s %s", ARMDasm::oplri },
{"strh%s %s", ARMDasm::opptrm },
{"and%s %s", ARMDasm::opari },
{"ldrd%s %s", ARMDasm::opptrm }, // ++ARM5E
{"and%s %s", ARMDasm::oprri },
{"strd%s %s", ARMDasm::opptrm }, // ++ARM5E
//0x01
{"and%ss %s", ARMDasm::oplli },
{"and%ss %s", ARMDasm::opllr },
{"and%ss %s", ARMDasm::oplri },
{"and%ss %s", ARMDasm::oplrr },
{"and%ss %s", ARMDasm::opari },
{"and%ss %s", ARMDasm::oparr },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -