📄 armdasm.cpp
字号:
/**************************************************************************
* DSemu - The Next Generation *
* Portable ARM cores: Common disassembler [armdasm.cpp] *
* Copyright Imran Nazar, 2005; released under the BSD public licence. *
**************************************************************************/
#include <string>
#include "armmasks.h"
#include "armdasm.h"
#include "datadefs.h"
char ARMDasm::dout[128]="";
u32 ARMDasm::tmp1=0;
u32 ARMDasm::tmp2=0;
u32 ARMDasm::tmp3=0;
u32 ARMDasm::tmp4=0;
u32 (*ARMDasm::rdW)(u32);
// The constructor is passed a function that can read words from memory;
// this is used by LDR to retrieve PC-relative values.
ARMDasm::ARMDasm(u32 (*addr)(u32))
{
rdW=addr;
}
// ARM-mode lookup
std::string ARMDasm::disasm(u32 op, u32 r15)
{
static char str[100];
u16 idx=DASMOP_EOP;
ops[idx].addr(op,r15);
dout[32]=0;
sprintf(str, ops[idx].str, condstr[DASMOP_COND], dout);
return std::string(str);
}
// Thumb-mode lookup
std::string ARMDasm::tdisasm(u16 op, u32 r15)
{
static char str[100];
u8 idx=(op&0xFF00)>>8;
tops[idx].addr((u32)op, r15);
dout[32]=0;
sprintf(str, tops[idx].str, dout);
return std::string(str);
}
void ARMDasm::opun(u32 op, u32 r15)
{
sprintf(dout," ");
}
//---ARM mode disassemblies------------------------------------------------
// Branching
void ARMDasm::opb(u32 op, u32 r15)
{
signed int b = (op&0x00800000)?(0xFF000000|(op&0x00FFFFFF))
:(op&0x00FFFFFF);
sprintf(dout,"$%08X",r15+8+(b*4));
}
void ARMDasm::opbreg(u32 op, u32 r15)
{
sprintf(dout,"r%d",DASMOP_RM);
}
// Data Processing
void ARMDasm::opreg(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opimm(u32 op, u32 r15)
{
tmp3 = op&255;
tmp4 = (op&0x00000F00)>>7;
tmp1 = (tmp3>>tmp4)|((tmp3&((1<<tmp4)-1))<<(32-tmp4));
sprintf(dout,"r%d, r%d, #$%08X", DASMOP_RD, DASMOP_RN, tmp1);
}
void ARMDasm::opcimm(u32 op, u32 r15)
{
tmp3 = op&255;
tmp4 = (op&0x00000F00)>>7;
tmp1 = (tmp3>>tmp4)|((tmp3&((1<<tmp4)-1))<<(32-tmp4));
sprintf(dout,"r%d, #$%08X", DASMOP_RN, tmp1);
}
void ARMDasm::oplli(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
(tmp4)?
sprintf(dout,"r%d, r%d, r%d, lsl #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4):
sprintf(dout,"r%d, r%d, r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opllr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d, lsl r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
void ARMDasm::oplri(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, r%d, r%d, lsr #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::oplrr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d, lsr r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
void ARMDasm::opari(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::oparr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d, asr r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
void ARMDasm::oprri(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);
}
void ARMDasm::oprrr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, r%d, ror r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
// Compare-specific disassemblies (Rd not required)
void ARMDasm::opclli(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
(tmp4)?
sprintf(dout,"r%d, r%d, lsl #%d", DASMOP_RN, DASMOP_RM, tmp4):
sprintf(dout,"r%d, r%d", DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opcllr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, lsl r%d", DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
void ARMDasm::opclri(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, r%d, lsr #%d", DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opclrr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, lsr r%d", DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
void ARMDasm::opcari(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, r%d, asr #%d", DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opcarr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, asr r%d", DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
void ARMDasm::opcrri(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
(tmp4)?
sprintf(dout,"r%d, r%d, ror #%d", DASMOP_RN, DASMOP_RM, tmp4):
sprintf(dout,"r%d, r%d, rrx", DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opcrrr(u32 op, u32 r15)
{
sprintf(dout,"r%d, r%d, ror r%d", DASMOP_RN, DASMOP_RM, DASMOP_RS);
}
// Load/Store
void ARMDasm::opofim(u32 op, u32 r15)
{
((DASMOP_RN==15) && (op&0x00100000))?
sprintf(dout,"r%d, =$%08X", DASMOP_RD, rdW(r15+8-(op&0x00000FFF))):
sprintf(dout,"r%d, [r%d, #-$%03X]", DASMOP_RD, DASMOP_RN, op&0x00000FFF);
}
void ARMDasm::opofip(u32 op, u32 r15)
{
((DASMOP_RN==15) && (op&0x00100000))?
sprintf(dout,"r%d, =$%08X", DASMOP_RD, rdW(r15+8+(op&0x00000FFF))):
sprintf(dout,"r%d, [r%d, #+$%03X]", DASMOP_RD, DASMOP_RN, op&0x00000FFF);
}
void ARMDasm::opofrm(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, -r%d]", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opofrmll(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, -r%d, lsl #%d]", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opofrmlr(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, -r%d, lsr #%d]", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opofrmar(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::opofrmrr(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);
}
void ARMDasm::opofrp(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, +r%d]", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opofrpll(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, +r%d, lsl #%d]", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opofrplr(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, +r%d, lsr #%d]", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opofrpar(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::opofrprr(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);
}
void ARMDasm::opprim(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #-$%03X]!", DASMOP_RD, DASMOP_RN, op&0x00000FFF);
}
void ARMDasm::opprip(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, #+$%03X]!", DASMOP_RD, DASMOP_RN, op&0x00000FFF);
}
void ARMDasm::opprrm(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, -r%d]!", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opprrmll(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, -r%d, lsl #%d]!", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opprrmlr(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, -r%d, lsr #%d]!", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opprrmar(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::opprrmrr(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);
}
void ARMDasm::opprrp(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d, +r%d]!", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opprrpll(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, +r%d, lsl #%d]!", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opprrplr(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d, +r%d, lsr #%d]!", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opprrpar(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::opprrprr(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);
}
void ARMDasm::opptim(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d], #-$%03X", DASMOP_RD, DASMOP_RN, op&0x00000FFF);
}
void ARMDasm::opptip(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d], #+$%03X", DASMOP_RD, DASMOP_RN, op&0x00000FFF);
}
void ARMDasm::opptrm(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d], -r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opptrmll(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d], -r%d, lsl #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opptrmlr(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d], -r%d, lsr #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opptrmar(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::opptrmrr(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);
}
void ARMDasm::opptrp(u32 op, u32 r15)
{
sprintf(dout,"r%d, [r%d], +r%d", DASMOP_RD, DASMOP_RN, DASMOP_RM);
}
void ARMDasm::opptrpll(u32 op, u32 r15)
{
tmp4=(op&0x00000F80)>>7;
sprintf(dout,"r%d, [r%d], +r%d, lsl #%d", DASMOP_RD, DASMOP_RN, DASMOP_RM, tmp4);
}
void ARMDasm::opptrplr(u32 op, u32 r15)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -