648 lines
19 KiB
C
648 lines
19 KiB
C
/* dsmI86Lib.h - i80x86 disassembler header */
|
|
|
|
/* Copyright 1984-2003 Wind River Systems, Inc. */
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
01k,16mar04,md Add output functions to dmsData() and dsmInst()
|
|
01j,01mar03,pai Made the FORMAT_X & FORMAT_Y opcode data pointers point to
|
|
constant data. Updated Copyright.
|
|
01i,16sep02,pai Updated support for SSE2 & Pentium 4 instructions.
|
|
01h,30aug01,hdn added SIMD, sysenter/exit support.
|
|
01g,06may98,fle added P5 and P6 instructions and facilities
|
|
01f,14nov94,hdn changed D->DISR, W->WFUL, S->SEXT, P->POP, A->AX, I->IMM.
|
|
+kdl minor cleanup.
|
|
01e,29may94,hdn removed I80486 conditional.
|
|
01d,31aug93,hdn changed a type of pD, from char to UCHAR.
|
|
changed a type of 1st parameter, from char to UCHAR.
|
|
01c,07jun93,hdn added support for c++
|
|
01b,26mar93,hdn added new instructions for 486.
|
|
01a,23jun92,hdn written.
|
|
*/
|
|
|
|
#ifndef __INCdsmI86Libh
|
|
#define __INCdsmI86Libh
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* includes */
|
|
|
|
#include "vwModNum.h"
|
|
|
|
|
|
/* dsmLib status codes */
|
|
|
|
#define S_dsmLib_UNKNOWN_INSTRUCTION (M_dsmLib | 1)
|
|
|
|
|
|
#define DSM_BUFSIZE16 (16)
|
|
#define DSM_BUFSIZE32 (32)
|
|
|
|
typedef struct /* INST */
|
|
{
|
|
const char * pOpc; /* Instruction Name */
|
|
int type; /* instruction type */
|
|
int flag; /* instruction flag */
|
|
int flag2; /* instruction flag2 */
|
|
UCHAR op0; /* opcode 0 */
|
|
UCHAR op1; /* opcode 1 */
|
|
UCHAR op2; /* opcode 2 */
|
|
UCHAR op3; /* opcode 3 */
|
|
UCHAR mask0; /* mask 0 */
|
|
UCHAR mask1; /* mask 1 */
|
|
UCHAR mask2; /* mask 2 */
|
|
UCHAR mask3; /* mask 3 */
|
|
|
|
} INST;
|
|
|
|
typedef struct /* FORMAT_X */
|
|
{
|
|
const INST * pI; /* pointer to an INST descriptor */
|
|
const char * pD; /* opcode data pointer */
|
|
const char * pOpc; /* instruction name pointer */
|
|
char obuf [DSM_BUFSIZE16]; /* instruction name buffer */
|
|
char a32; /* address size 0,1 */
|
|
char d32; /* data size 0,1 */
|
|
char lenO; /* opcode length 1,2 */
|
|
char lenD; /* displacement length 0,1,2,4 */
|
|
char lenI; /* immediate length 0,1,2,4 */
|
|
char modrm; /* MODRM 0,1 */
|
|
char sib; /* SIB 0,1 */
|
|
char w; /* W 0,1 */
|
|
char d; /* D 0,1 */
|
|
char s; /* S 0,1 */
|
|
char reg; /* register 3 bits, 8 bits */
|
|
char mod; /* value of MODRM byte bits 6,7 */
|
|
char rm; /* value of MODRM byte bits 0,1,2 */
|
|
char ss;
|
|
char index;
|
|
char base;
|
|
char mf;
|
|
char st;
|
|
char fd;
|
|
|
|
} FORMAT_X;
|
|
|
|
typedef struct /* FORMAT_Y */
|
|
{
|
|
const char * pD; /* opcode data pointer */
|
|
const char * pOpc; /* instruction name pointer */
|
|
char * pOpr0; /* output string 0 */
|
|
char * pOpr1; /* output string 1 */
|
|
char * pOpr2; /* output string 2 */
|
|
int len; /* instruction length */
|
|
int addr; /* address operand */
|
|
char obuf [DSM_BUFSIZE16]; /* opcode buffer */
|
|
char rbuf [DSM_BUFSIZE16]; /* register buffer */
|
|
char mbuf [DSM_BUFSIZE32]; /* memory buffer */
|
|
char temp [DSM_BUFSIZE32]; /* temporary buffer */
|
|
char ibuf [DSM_BUFSIZE16]; /* immediate buffer */
|
|
char dbuf [DSM_BUFSIZE16]; /* displacement buffer */
|
|
|
|
} FORMAT_Y;
|
|
|
|
/* bit definitions of flag */
|
|
|
|
/* jhw: MSB of flag byte is not included in switch statement used
|
|
* to format the output.
|
|
*/
|
|
|
|
/* MODRM must be defined if REG, MMXREG, XMMREG are defined */
|
|
|
|
#define SF (0x10000000)
|
|
#define OP1 (0x20000000)
|
|
#define OP2 (0x40000000)
|
|
#define OP3 (0x80000000)
|
|
#define WFUL (0x01000000) /* operand size bit */
|
|
#define SEXT (0x02000000) /* sign extend flag */
|
|
#define DISR (0x04000000) /* data direction info encoded in opcode */
|
|
#define TTT (0x08000000) /* hack to look for rotate instructions */
|
|
|
|
#define TTTN (0x00100000) /* opcode least significant byte
|
|
* bits 0-4 = condition test field */
|
|
#define MF (0x00200000) /* opcode bits 1-2 are = register size info */
|
|
#define POP (0x00400000) /* cat a "P" to end of instruction name */
|
|
|
|
#define IMM (0x00000001)
|
|
#define I8 (0x00000002) /* imm8 byte exists */
|
|
#define DIS (0x00000004) /* displacement info */
|
|
#define D8 (0x00000008) /* displacement info */
|
|
#define D16 (0x00000010) /* displacement info */
|
|
#define AX (0x00000020) /* store into AX register */
|
|
#define CL (0x00000040) /* cat "CL" to end of operands */
|
|
#define REG (0x00000080) /* modrm bits 3-5 = register specifier */
|
|
#define SREG2 (0x00000100) /* modrm bits 3-4 = 2 bit segment register */
|
|
#define SREG3 (0x00000200) /* modrm bits 3-5 = 3 bit segment register */
|
|
#define MODRM (0x00000400) /* modrm byte exists */
|
|
#define EEE (0x00000800) /* modrm bits 3-5 = control/debug register */
|
|
#define REGRM (0x00001000) /* modrm bits 0-2 = register specifier */
|
|
#define PORT (0x00002000) /* use a port as an operand */
|
|
#define OFFSEL (0x00004000) /* jump or call offset */
|
|
#define D16L8 (0x00008000) /* displacement info */
|
|
#define FD (0x00010000) /* stack element is destination */
|
|
#define ST (0x00020000) /* stack element is operand */
|
|
#define MMXRM (0x00040000) /* modrm bits 0-2 = MMX register */
|
|
#define MMXREG (0x00080000) /* modrm bits 3-5 = MMX register */
|
|
#define GG (0x00800000) /* least sign opcode byte
|
|
* bits 0-1 = MMX granularity */
|
|
|
|
/* bit definitions of flag2 */
|
|
|
|
#define XMMRM (0x00000001) /* modrm bits 0-2 = XMM register */
|
|
#define XMMREG (0x00000002) /* modrm bits 3-5 = XMM register */
|
|
|
|
#define ESC (0xd8) /* for co-processor instructions */
|
|
|
|
/* instruction types */
|
|
|
|
#define itAaa 1
|
|
#define itAad 2
|
|
#define itAam 3
|
|
#define itAas 4
|
|
#define itAddItoA 5
|
|
#define itAddItoRM 6
|
|
#define itAddRMtoRM 7
|
|
#define itAndItoA 8
|
|
#define itAndItoRM 9
|
|
#define itAndRMtoRM 10
|
|
#define itArpl 11
|
|
#define itAsize 12
|
|
#define itBound 13
|
|
#define itBsf 14
|
|
#define itBsr 15
|
|
#define itBtI 16
|
|
#define itBtR 17
|
|
#define itBtcI 18
|
|
#define itBtcR 19
|
|
#define itBtrI 20
|
|
#define itBtrR 21
|
|
#define itBtsI 22
|
|
#define itBtsR 23
|
|
#define itCall 24
|
|
#define itCallRM 25
|
|
#define itCallSeg 26
|
|
#define itCallSegRM 27
|
|
#define itCbw 28
|
|
#define itCjmp 29
|
|
#define itClc 30
|
|
#define itCld 31
|
|
#define itCli 32
|
|
#define itClts 33
|
|
#define itCmc 34
|
|
#define itCmpIwiA 35
|
|
#define itCmpIwiRM 36
|
|
#define itCmpRMwiRM 37
|
|
#define itCmps 38
|
|
#define itCs 39
|
|
#define itCset 40
|
|
#define itCwd 41
|
|
#define itDaa 42
|
|
#define itDas 43
|
|
#define itDecR 44
|
|
#define itDecRM 45
|
|
#define itDiv 46
|
|
#define itDs 47
|
|
#define itEnter 48
|
|
#define itEs 49
|
|
#define itFs 50
|
|
#define itGs 51
|
|
#define itHlt 52
|
|
#define itIdiv 53
|
|
#define itImulAwiRM 54
|
|
#define itImulRMwiI 55
|
|
#define itImulRwiRM 56
|
|
#define itInF 57
|
|
#define itInV 58
|
|
#define itIncR 59
|
|
#define itIncRM 60
|
|
#define itIns 61
|
|
#define itInt 62
|
|
#define itInt3 63
|
|
#define itInto 64
|
|
#define itIret 65
|
|
#define itJcxz 66
|
|
#define itJmpD 67
|
|
#define itJmpRM 68
|
|
#define itJmpS 69
|
|
#define itJmpSeg 70
|
|
#define itJmpSegRM 71
|
|
#define itLahf 72
|
|
#define itLar 73
|
|
#define itLds 74
|
|
#define itLea 75
|
|
#define itLeave 76
|
|
#define itLes 77
|
|
#define itLfs 78
|
|
#define itLgdt 79
|
|
#define itLgs 80
|
|
#define itLidt 81
|
|
#define itLldt 82
|
|
#define itLmsw 83
|
|
#define itLock 84
|
|
#define itLods 85
|
|
#define itLoop 86
|
|
#define itLoopnz 87
|
|
#define itLoopz 88
|
|
#define itLsl 89
|
|
#define itLss 90
|
|
#define itLtr 91
|
|
#define itMovAMtoMA 92
|
|
#define itMovC 93
|
|
#define itMovD 94
|
|
#define itMovItoR 95
|
|
#define itMovItoRM 96
|
|
#define itMovRMtoMR 97
|
|
#define itMovRMtoS 98
|
|
#define itMovRtoRM 99
|
|
#define itMovStoRM 100
|
|
#define itMovT 101
|
|
#define itMovs 102
|
|
#define itMovsx 103
|
|
#define itMovzx 104
|
|
#define itMulAwiRM 105
|
|
#define itNeg 106
|
|
#define itNop 107
|
|
#define itNot 108
|
|
#define itOrItoA 109
|
|
|
|
#define itOrItoRM 111
|
|
|
|
#define itOrRMtoRM 113
|
|
|
|
#define itOsize 115
|
|
#define itOutF 116
|
|
#define itOutV 117
|
|
#define itOuts 118
|
|
#define itPopR 119
|
|
#define itPopRM 120
|
|
#define itPopS 121
|
|
#define itPopa 122
|
|
#define itPopf 123
|
|
#define itPushI 124
|
|
#define itPushR 125
|
|
#define itPushRM 126
|
|
#define itPushS 127
|
|
#define itPusha 128
|
|
#define itPushf 129
|
|
#define itRNcmps 130
|
|
#define itRNscas 131
|
|
#define itRcmps 132
|
|
#define itRet 133
|
|
#define itRetI 134
|
|
#define itRetSeg 135
|
|
#define itRetSegI 136
|
|
#define itRins 137
|
|
#define itRlods 138
|
|
#define itRmovs 139
|
|
#define itRolRMby1 140
|
|
#define itRolRMbyCL 141
|
|
#define itRolRMbyI 142
|
|
#define itRouts 143
|
|
#define itRscas 144
|
|
#define itRstos 145
|
|
#define itSahf 146
|
|
#define itSbbIfrA 147
|
|
#define itSbbIfrRM 148
|
|
#define itSbbRMfrRM 149
|
|
#define itScas 150
|
|
#define itSgdt 151
|
|
#define itShldRMbyCL 152
|
|
#define itShldRMbyI 153
|
|
#define itShrdRMbyCL 154
|
|
#define itShrdRMbyI 155
|
|
#define itSmsw 156
|
|
#define itSs 157
|
|
#define itStc 158
|
|
#define itStd 159
|
|
#define itSti 160
|
|
#define itStos 161
|
|
#define itStr 162
|
|
|
|
#define itSubIfrA 164
|
|
#define itSubIfrRM 165
|
|
#define itSubRMfrRM 166
|
|
#define itTestIanA 167
|
|
#define itTestIanRM 168
|
|
#define itTestRManR 169
|
|
#define itWait 170
|
|
#define itXchgA 171
|
|
#define itXchgRM 172
|
|
#define itXlat 173
|
|
|
|
/* instructions for 387 */
|
|
|
|
#define itF2xm1 174
|
|
#define itFabs 175
|
|
#define itFaddIRM 176
|
|
#define itFaddST 177
|
|
#define itFchs 178
|
|
#define itFclex 179
|
|
#define itFcomIRM 180
|
|
#define itFcomST 181
|
|
#define itFcompIRM 182
|
|
#define itFcompST 183
|
|
#define itFcompp 184
|
|
#define itFcos 185
|
|
#define itFdecstp 186
|
|
#define itFdivIRM 187
|
|
#define itFdivST 188
|
|
#define itFfree 189
|
|
#define itFincstp 190
|
|
#define itFinit 191
|
|
#define itFld1 192
|
|
#define itFldBCDM 193
|
|
#define itFldERM 194
|
|
#define itFldIRM 195
|
|
#define itFldL2E 196
|
|
#define itFldL2T 197
|
|
#define itFldLG2 198
|
|
#define itFldLIM 199
|
|
#define itFldLN2 200
|
|
#define itFldPI 201
|
|
#define itFldST 202
|
|
#define itFldZ 203
|
|
#define itFldcw 204
|
|
#define itFldenv 205
|
|
#define itFmulIRM 206
|
|
#define itFmulST 207
|
|
#define itFnop 208
|
|
#define itFpatan 209
|
|
#define itFprem 210
|
|
#define itFprem1 211
|
|
#define itFptan 212
|
|
#define itFrndint 213
|
|
#define itFrstor 214
|
|
#define itFsave 215
|
|
#define itFscale 216
|
|
#define itFsin 217
|
|
#define itFsincos 218
|
|
#define itFsqrt 219
|
|
#define itFstIRM 220
|
|
#define itFstST 221
|
|
#define itFstcw 222
|
|
#define itFstenv 223
|
|
#define itFstpBCDM 224
|
|
#define itFstpERM 225
|
|
#define itFstpIRM 226
|
|
#define itFstpLIM 227
|
|
#define itFstpST 228
|
|
#define itFstsw 229
|
|
#define itFstswA 230
|
|
#define itFsubIRM 231
|
|
#define itFsubST 232
|
|
#define itFtst 233
|
|
#define itFucom 234
|
|
#define itFucomp 235
|
|
#define itFucompp 236
|
|
#define itFxam 237
|
|
#define itFxch 238
|
|
#define itFxtract 239
|
|
#define itFyl2x 240
|
|
#define itFyl2xp1 241
|
|
#define itFcmovb 242
|
|
#define itFcmove 243
|
|
#define itFcmovbe 244
|
|
#define itFcmovu 245
|
|
#define itFcmovnb 246
|
|
#define itFcmovne 247
|
|
#define itFcmovnbe 248
|
|
#define itFcmovnu 249
|
|
#define itFcomi 250
|
|
|
|
|
|
/* addendum */
|
|
|
|
#define itSidt 300
|
|
#define itSldt 301
|
|
#define itVerr 302
|
|
#define itVerw 303
|
|
#define itXorItoRM 304
|
|
#define itAdcItoRM 305
|
|
#define itXorItoA 306
|
|
#define itAdcItoA 307
|
|
#define itXorRMtoRM 308
|
|
#define itAdcRMtoRM 309
|
|
#define itRep 310
|
|
#define itRepNe 311
|
|
|
|
/* 80486 instructions */
|
|
|
|
#define itBswap 400
|
|
#define itCmpxchg 401
|
|
#define itXadd 402
|
|
#define itInvd 403
|
|
#define itWbinvd 404
|
|
#define itInvlpg 405
|
|
|
|
/* P5 instructions */
|
|
|
|
#define itCmpxchg8b 500
|
|
#define itCpuid 501
|
|
#define itRdtsc 502
|
|
#define itRdmsr 503
|
|
#define itWrmsr 504
|
|
#define itRsm 505
|
|
|
|
/* P6 instructions */
|
|
|
|
#define itCmovcc 600
|
|
#define itRdpmc 601
|
|
#define itUd2 602
|
|
#define itSysenter 603
|
|
#define itSysexit 604
|
|
|
|
/* MMX/SSE2 instructions */
|
|
|
|
#define itEmms 700
|
|
#define itMovd 701
|
|
#define itMovq 702
|
|
#define itPackssdw 703
|
|
#define itPacksswb 704
|
|
#define itPackuswb 705
|
|
#define itPadd 706
|
|
#define itPadds 707
|
|
#define itPaddus 708
|
|
#define itPand 709
|
|
#define itPandn 710
|
|
#define itPcmpeq 711
|
|
#define itPcmpgt 712
|
|
#define itPmadd 713
|
|
#define itPmulh 714
|
|
#define itPmull 715
|
|
#define itPor 716
|
|
#define itPsll 717
|
|
#define itPsra 718
|
|
#define itPsrl 719
|
|
#define itPsub 720
|
|
#define itPsubs 721
|
|
#define itPsubus 722
|
|
#define itPunpckh 723
|
|
#define itPunpckl 724
|
|
#define itPxor 725
|
|
|
|
/* SSE/SSE2 instructions */
|
|
|
|
#define itAddpd 800
|
|
#define itAddps 801
|
|
#define itAddsd 802
|
|
#define itAddss 803
|
|
#define itAndnpd 804
|
|
#define itAndnps 805
|
|
#define itAndpd 806
|
|
#define itAndps 807
|
|
|
|
#define itCmppd 821
|
|
#define itCmpps 822
|
|
#define itCmpsd 823
|
|
#define itCmpss 824
|
|
|
|
#define itComiss 827
|
|
#define itCvtdq2pd 828
|
|
#define itCvtdq2ps 829
|
|
#define itCvtpd2dq 830
|
|
#define itCvtpd2ps 831
|
|
#define itCvtpi2pd 832
|
|
#define itCvtpi2ps 833
|
|
#define itCvtps2dq 834
|
|
#define itCvtps2pd 835
|
|
#define itCvtps2pi 836
|
|
#define itCvtsd2si 837
|
|
#define itCvtsd2ss 838
|
|
#define itCvtsi2sd 839
|
|
#define itCvtsi2ss 840
|
|
#define itCvtss2sd 841
|
|
#define itCvtss2si 842
|
|
#define itCvttpd2dq 843
|
|
#define itCvttpd2pi 844
|
|
#define itCvttps2dq 845
|
|
#define itCvttps2pi 846
|
|
#define itCvttsd2si 847
|
|
#define itCvttss2si 848
|
|
#define itDivpd 849
|
|
#define itDivps 850
|
|
#define itDivsd 851
|
|
#define itDivss 852
|
|
#define itFxrstor 853
|
|
#define itFxsave 854
|
|
#define itLdmxcsr 855
|
|
#define itMaskmovdqu 856
|
|
#define itMaskmovq 857
|
|
#define itMaxpd 858
|
|
#define itMaxps 859
|
|
#define itMaxsd 860
|
|
#define itMaxss 861
|
|
#define itMinpd 862
|
|
#define itMinps 863
|
|
#define itMinsd 864
|
|
#define itMinss 865
|
|
#define itMovapd 866
|
|
#define itMovaps 867
|
|
#define itMovdq2q 868
|
|
#define itMovdqa 869
|
|
#define itMovdqu 870
|
|
#define itMovhlps 871
|
|
#define itMovhpd 872
|
|
#define itMovhps 873
|
|
#define itMovlhps 874
|
|
#define itMovlpd 875
|
|
#define itMovlps 876
|
|
#define itMovmskpd 877
|
|
#define itMovmskps 878
|
|
#define itMovntdq 879
|
|
#define itMovntpd 880
|
|
#define itMovntps 881
|
|
#define itMovntq 882
|
|
#define itMovq2dq 883
|
|
#define itMovsd 884
|
|
#define itMovss 885
|
|
#define itMovupd 886
|
|
#define itMovups 887
|
|
#define itMulpd 888
|
|
#define itMulps 889
|
|
#define itMulsd 890
|
|
#define itMulss 891
|
|
#define itOrpd 892
|
|
#define itOrps 893
|
|
#define itPavgb 894
|
|
#define itPavgw 895
|
|
#define itPextrw 896
|
|
#define itPinsrw 897
|
|
#define itPmaxsw 898
|
|
#define itPmaxub 899
|
|
#define itPminsw 900
|
|
#define itPminub 901
|
|
#define itPmovmskb 902
|
|
#define itPmulhuw 903
|
|
#define itPmuludq 904
|
|
#define itPrefetchnta 905
|
|
#define itPrefetcht0 906
|
|
#define itPrefetcht1 907
|
|
#define itPrefetcht2 908
|
|
#define itPsadbw 909
|
|
#define itPshufd 910
|
|
#define itPshufhw 911
|
|
#define itPshuflw 912
|
|
#define itPshufw 913
|
|
#define itPslldq 914
|
|
#define itPsrldq 915
|
|
#define itPunpckhqdq 916
|
|
#define itPunpcklqdq 917
|
|
#define itRcpps 918
|
|
#define itRcpss 919
|
|
#define itRsqrtps 920
|
|
#define itRsqrtss 921
|
|
#define itSfence 922
|
|
#define itShufps 923
|
|
#define itSqrtpd 924
|
|
#define itSqrtps 925
|
|
#define itSqrtsd 926
|
|
#define itSqrtss 927
|
|
#define itStmxcsr 928
|
|
#define itSubpd 929
|
|
#define itSubps 930
|
|
#define itSubsd 931
|
|
#define itSubss 932
|
|
#define itUcomisd 933
|
|
#define itUcomiss 934
|
|
#define itUnpckhpd 935
|
|
#define itUnpckhps 936
|
|
#define itUnpcklpd 937
|
|
#define itUnpcklps 938
|
|
#define itXorpd 939
|
|
#define itXorps 940
|
|
|
|
/* Pentium 4 instructions */
|
|
|
|
#define itClflush 1000
|
|
#define itLfence 1001
|
|
#define itMfence 1002
|
|
#define itMovnti 1003
|
|
#define itPause 1004
|
|
|
|
|
|
/* function declarations */
|
|
|
|
#if defined (__STDC__) || defined (__cplusplus)
|
|
|
|
IMPORT int dsmData (UCHAR *, int, FUNCPTR, int);
|
|
IMPORT int dsmInst (UCHAR *, int, VOIDFUNCPTR, FUNCPTR, int);
|
|
IMPORT int dsmNbytes (UCHAR *);
|
|
|
|
#else
|
|
|
|
IMPORT int dsmData ();
|
|
IMPORT int dsmInst ();
|
|
IMPORT int dsmNbytes ();
|
|
|
|
#endif /* __STDC__ */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCdsmI86Libh */
|