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

📄 armdasm.cpp

📁 一个任天堂掌上游戏机NDS的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************
* 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 + -