Windows2000/private/windbg64/langapi/dis/disarm.h
2020-09-30 17:12:32 +02:00

620 lines
14 KiB
C++

/*
* Microsoft Disassembler
*
* Microsoft Confidential. Copyright 1994-1997 Microsoft Corporation.
*
* Component:
*
* File: disarm.h
*
* File Comments:
*
* This file is a copy of the master version owned by richards.
* Contact richards for any changes.
*
***********************************************************************/
#pragma pack(push, 8)
class DISARM : public DIS
{
public:
enum TRMTA
{
trmtaUnknown = DIS::trmtaUnknown,
trmtaFallThrough = DIS::trmtaFallThrough,
trmtaBra,
trmtaBraInd,
trmtaBraCc,
trmtaBraCcInd,
trmtaCall,
trmtaCallCc,
trmtaCallInd,
trmtaCallCcInd,
trmtaTrap,
trmtaTrapCc,
trmtaBraCase,
trmtaAfterCatch,
trmtaBraIndMaybe_15_12,
trmtaBraIndMaybe_19_16,
};
enum REGA
{
regaR0 = 0,
regaR1 = 1,
regaR2 = 2,
regaR3 = 3,
regaR4 = 4,
regaR5 = 5,
regaR6 = 6,
regaR7 = 7,
regaR8 = 8,
regaR9 = 9,
regaR10 = 10,
regaR11 = 11,
regaR12 = 12,
regaR13 = 13,
regaR14 = 14,
regaR15 = 15,
};
struct IW_MFS // move_from_status
{
DWORD mbz : 12;
DWORD Rd : 4;
DWORD mbo : 4;
DWORD SL : 1; // = 0
DWORD AW : 1; // = 0
DWORD R : 1;
DWORD sub : 5; // = 2
DWORD cond : 4;
};
struct IW_MRTS // move_reg_to_status
{
DWORD Rm : 4;
DWORD mbz : 8;
DWORD mbo : 4;
DWORD mask : 4;
DWORD SL : 1; // = 0
DWORD AW : 1; // = 1
DWORD R : 1;
DWORD sub : 5; // = 2
DWORD cond : 4;
};
struct IW_BX // branch_exch_instrset
{
DWORD Rm : 4;
DWORD sub1 : 4; // = 1
DWORD mbo : 12;
DWORD sub : 8; // = 0x12
DWORD cond : 4;
};
struct IW_SSB // swap_swap_byte
{
DWORD Rm : 4;
DWORD sub1 : 4; // = 9
DWORD mbz : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD SL : 1; // = 0
DWORD AW : 1; // = 0
DWORD B : 1;
DWORD sub2 : 2; // = 2
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_DPIS // data_proc_imm_shift
{
DWORD Rm : 4;
DWORD mbz : 1;
DWORD shifttype : 2;
DWORD shiftamt : 5;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD S : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_DPISM // data_proc_imm_shift_move
{
DWORD Rm : 4;
DWORD mbz : 1;
DWORD shifttype : 2;
DWORD shiftamt : 5;
DWORD Rd : 4;
DWORD mbzRn : 4;
DWORD S : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_DPIST // data_proc_imm_shift_test
{
DWORD Rm : 4;
DWORD mbz : 1;
DWORD shifttype : 2;
DWORD shiftamt : 5;
DWORD mbzRd : 4;
DWORD Rn : 4;
DWORD mboS : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_DPRS // data_proc_reg_shift
{
DWORD Rm : 4;
DWORD mbo : 1;
DWORD shifttype : 2;
DWORD mbz : 1;
DWORD Rs : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD S : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_DPRSM // data_proc_reg_shift_move
{
DWORD Rm : 4;
DWORD mbo : 1;
DWORD shifttype : 2;
DWORD mbz : 1;
DWORD Rs : 4;
DWORD Rd : 4;
DWORD mbzRn : 4;
DWORD S : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_DPRST // data_proc_reg_shift_test
{
DWORD Rm : 4;
DWORD mbo : 1;
DWORD shifttype : 2;
DWORD mbz : 1;
DWORD Rs : 4;
DWORD mbzRd : 4;
DWORD Rn : 4;
DWORD mboS : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_M // multiply
{
DWORD Rm : 4;
DWORD sub1 : 4; // = 9
DWORD Rs : 4;
DWORD mbz : 4;
DWORD Rd : 4;
DWORD S : 1;
DWORD A : 1; // = 0
DWORD mbz1 : 1;
DWORD sub2 : 2; // = 0
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_MA // multiply_accum
{
DWORD Rm : 4;
DWORD sub1 : 4; // = 9
DWORD Rs : 4;
DWORD Rn : 4;
DWORD Rd : 4;
DWORD S : 1;
DWORD A : 1; // = 1
DWORD mbz1 : 1;
DWORD sub2 : 2; // = 0
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_ML // multiply_long
{
DWORD Rm : 4;
DWORD sub1 : 4; // = 9
DWORD Rs : 4;
DWORD RdLo : 4;
DWORD RdHi : 4;
DWORD S : 1;
DWORD A : 1;
DWORD U : 1;
DWORD sub2 : 2; // = 1
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_LHBI // load_half_byte_imm
{
DWORD LoOff : 4;
DWORD mbo1 : 1;
DWORD H : 1;
DWORD S : 1;
DWORD mbo2 : 1;
DWORD HiOff : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD L : 1; // = 1
DWORD W : 1;
DWORD I : 1; // = 1
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_LHBR // load_half_byte_reg
{
DWORD Rm : 4;
DWORD mbo1 : 1;
DWORD H : 1;
DWORD S : 1;
DWORD mbo2 : 1;
DWORD mbz : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD L : 1; // = 1
DWORD W : 1;
DWORD I : 1; // = 0
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_SHBI // store_half_byte_imm
{
DWORD LoOff : 4;
DWORD mbo1 : 1;
DWORD H : 1;
DWORD S : 1;
DWORD mbo2 : 1;
DWORD HiOff : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD L : 1; // = 0
DWORD W : 1;
DWORD I : 1; // = 1
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_SHBR // store_half_byte_reg
{
DWORD Rm : 4;
DWORD mbo1 : 1;
DWORD H : 1;
DWORD S : 1;
DWORD mbo2 : 1;
DWORD mbz : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD L : 1; // = 1
DWORD W : 1;
DWORD I : 1; // = 0
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 0
DWORD cond : 4;
};
struct IW_MITS // move_imm_to_status
{
DWORD imm : 8;
DWORD rot : 4;
DWORD mbo : 4;
DWORD mbz : 3;
DWORD mbo1 : 1;
DWORD SL : 1; // = 0
DWORD AW : 1; // = 1
DWORD R : 1;
DWORD sub1 : 2; // = 2
DWORD sub : 3; // = 1
DWORD cond : 4;
};
struct IW_DPI // data_proc_immediate
{
DWORD imm : 8;
DWORD rot : 4;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD S : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 1
DWORD cond : 4;
};
struct IW_DPIM // data_proc_immediate_move
{
DWORD imm : 8;
DWORD rot : 4;
DWORD Rd : 4;
DWORD mbzRn : 4;
DWORD S : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 1
DWORD cond : 4;
};
struct IW_DPIT // data_proc_immediate_test
{
DWORD imm : 8;
DWORD rot : 4;
DWORD mbzRd : 4;
DWORD Rn : 4;
DWORD mboS : 1;
DWORD opcode : 4;
DWORD sub : 3; // = 1
DWORD cond : 4;
};
struct IW_LIO // ldst_imm_offset
{
DWORD imm : 12;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD L : 1;
DWORD W : 1;
DWORD B : 1;
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 2
DWORD cond : 4;
};
struct IW_LRO // ldst_reg_offset
{
DWORD Rm : 4;
DWORD mbz : 1;
DWORD shifttype : 2;
DWORD shiftamt : 5;
DWORD Rd : 4;
DWORD Rn : 4;
DWORD L : 1;
DWORD W : 1;
DWORD B : 1;
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 3
DWORD cond : 4;
};
struct IW_UI // undefined_instr
{
DWORD any1 : 4;
DWORD mbo : 1;
DWORD any2 : 20;
DWORD sub : 3; // = 3
DWORD cond : 4;
};
struct IW_LM // load_multiple
{
DWORD reglist : 16;
DWORD Rn : 4;
DWORD L : 1; // = 1
DWORD W : 1;
DWORD S : 1;
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 4
DWORD cond : 4;
};
struct IW_SM // store_multiple
{
DWORD reglist : 16;
DWORD Rn : 4;
DWORD L : 1; // = 0
DWORD W : 1;
DWORD S : 1;
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 4
DWORD cond : 4;
};
struct IW_BB // b_bl
{
DWORD offset : 24;
DWORD L : 1;
DWORD sub : 3; // = 5
DWORD cond : 4;
};
struct IW_CL // cp_ldst
{
DWORD imm : 8;
DWORD cpnum : 4;
DWORD CRd : 4;
DWORD Rn : 4;
DWORD L : 1;
DWORD W : 1;
DWORD N : 1;
DWORD U : 1;
DWORD P : 1;
DWORD sub : 3; // = 6
DWORD cond : 4;
};
struct IW_CDP // cp_data_proc
{
DWORD CRm : 4;
DWORD mbz : 1;
DWORD opcode2 : 3;
DWORD cpnum : 4;
DWORD CRd : 4;
DWORD CRn : 4;
DWORD opcode1 : 4;
DWORD mbz1 : 1;
DWORD sub : 3; // = 7
DWORD cond : 4;
};
struct IW_CRX // cp_reg_xfer
{
DWORD CRm : 4;
DWORD mbo : 1;
DWORD opcode2 : 3;
DWORD cpnum : 4;
DWORD Rd : 4;
DWORD CRn : 4;
DWORD L : 1;
DWORD opcode1 : 3;
DWORD mbz : 1;
DWORD sub : 3; // = 7
DWORD cond : 4;
};
struct IW_S // swi
{
DWORD swinum : 24;
DWORD mbo : 1;
DWORD sub : 3; // = 7
DWORD cond : 4;
};
union IW // Instruction Word
{
DWORD dw;
IW_MFS MFS; // move_from_status
IW_MRTS MRTS; // move_reg_to_status
IW_BX BX; // branch_exch_instrset
IW_SSB SSB; // swap_swap_byte
IW_DPIS DPIS; // data_proc_imm_shift
IW_DPISM DPISM; // data_proc_imm_shift_move
IW_DPIST DPIST; // data_proc_imm_shift_test
IW_DPRS DPRS; // data_proc_reg_shift
IW_DPRSM DPRSM; // data_proc_reg_shift_move
IW_DPRST DPRST; // data_proc_reg_shift_test
IW_M M; // multiply
IW_MA MA; // multiply_accum
IW_ML ML; // multiply_long
IW_LHBI LHBI; // load_half_byte_imm
IW_LHBR LHBR; // load_half_byte_reg
IW_SHBI SHBI; // store_half_byte_imm
IW_SHBR SHBR; // store_half_byte_reg
IW_MITS MITS; // move_imm_to_status
IW_DPI DPI; // data_proc_immediate
IW_DPIM DPIM; // data_proc_immediate_move
IW_DPIT DPIT; // data_proc_immediate_test
IW_LIO LIO; // ldst_imm_offset
IW_LRO LRO; // ldst_reg_offset
IW_UI UI; // undefined_instr
IW_LM LM; // load_multiple
IW_SM SM; // store_multiple
IW_BB BB; // b_bl
IW_CL CL; // cp_ldst
IW_CDP CDP; // cp_data_proc
IW_CRX CRX; // cp_reg_xfer
IW_S S; // swi
};
DISARM(DIST);
// Methods inherited from DIS
ADDR AddrOperand(size_t) const;
ADDR AddrTarget() const;
size_t Cb() const;
size_t CbDisassemble(ADDR, const void *, size_t);
size_t CbJumpEntry() const;
size_t CchFormatBytes(char *, size_t) const;
size_t CchFormatBytesMax() const;
size_t Coperand() const;
void FormatAddr(std::ostream&, ADDR) const;
void FormatInstr(std::ostream&) const;
MEMREFT Memreft(size_t) const;
TRMT Trmt() const;
DIS::TRMTA Trmta() const;
private:
enum ICLS // Instruction Class
{
iclsInvalid, // Invalid Class
iclsMFS, // move_from_status
iclsMRTS, // move_reg_to_status
iclsBX, // branch_exch_instrset
iclsSSB, // swap_swap_byte
iclsDPIS, // data_proc_imm_shift
iclsDPISM, // data_proc_imm_shift_move
iclsDPIST, // data_proc_imm_shift_test
iclsDPRS, // data_proc_reg_shift
iclsDPRSM, // data_proc_reg_shift_move
iclsDPRST, // data_proc_reg_shift_test
iclsM, // multiply
iclsMA, // multiply_accum
iclsML, // multiply_long
iclsLHBI, // load_half_byte_imm
iclsLHBR, // load_half_byte_reg
iclsSHBI, // store_half_byte_imm
iclsSHBR, // store_half_byte_reg
iclsMITS, // move_imm_to_status
iclsDPI, // data_proc_immediate
iclsDPIM, // data_proc_immediate_move
iclsDPIT, // data_proc_immediate_test
iclsLIO, // ldst_imm_offset
iclsLRO, // ldst_reg_offset
iclsUI, // undefined_instr
iclsLM, // load_multiple
iclsSM, // store_multiple
iclsBB, // b_bl
iclsCL, // cp_ldst
iclsCDP, // cp_data_proc
iclsCRX, // cp_reg_xfer
iclsS, // swi
};
enum FormatFlags
{
FMT_NO_FLAGS = 0,
FMT_DOING_COMMENT = 1,
FMT_NEXT = 2,
};
enum Regs
{
REG_PC = 15
};
static const char * const cond_name[];
static const char * const coproc_regs[];
static const char * const data_proc_opcodes[];
static const char * const regs[];
static void do_comma(std::ostream&, int&);
static void do_semi(std::ostream&, int&, unsigned&);
DWORD DwBitfield(unsigned, unsigned) const;
const char *FormatCondText(std::ostream&, const char *, unsigned, int&, unsigned&) const;
const char *PchFormatPart(std::ostream&, const char *, int&, unsigned&) const;
const char *SzFindFormat() const;
IW m_iw;
const char *m_szFormat;
};
#pragma pack(pop)