?? opcodes.asm
字號:
;
; GRDP
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; opcodes.asm
;
; Locate the opcode table entry for a given opcode byte
; ALSO, locate the opcode table entries for a given mnemonic
;
;MASM MODE
.model small
.386p
include iopcodes.inc
include eoptions.inc
include eopcom.inc
PUBLIC FindOpcode
PUBLIC mnemonicMatchCount
PUBLIC mnemonicMatchAddrTable
PUBLIC LookupOpName
public x86pfx
.data
x86pfx db 0
;
; Following is a table of opcodes. Each entry consists of a mask value,
; a comparison value, a pointer to the name, the addressing mode to be
; used in dissassembly, and the base length of the instruction (possibly
; modified by the exact addressing mode encountered)
;
; added two new bytes: first is evalutation flags, second is unused
;
; The groups are selected based on the high order 3 bits of the first
; byte of the opcode, which are translated into a table offset. These
; bits probably encode something that all opcodes have in common if the
; high order 3 bits are the same, but I don't know what it might be.
; In any case, from the lookup logic, it appears that these structures
; are broken into groups only for performance, which is hardly necessary
; since this program won't run on anything less than a P24T - it has a
; CPUID instruction in it.
group000xxxxx label byte
opcode <0FCh,0,opn_add,OP_REGRMREG,2,0,0> ;ADD RM
opcode <0e7h,06h,opn_push,OP_SEG35,1,0,0> ;PUSH
opcode <0feh,04h,opn_add,OP_ACCIMM,1,0,0> ;ADD immediate
opcode <0e7h,07h,opn_pop,OP_SEG35,1,0,0> ;POP
opcode <0fch,08h,opn_or,OP_REGRMREG,2,0,0> ;OR RM
opcode <0feh,0ch,opn_or,OP_ACCIMM,1,0,0> ;OR immediate
opcode <0fch,010h,opn_adc,OP_REGRMREG,2,0,0> ;ADC RM
opcode <0feh,014h,opn_adc,OP_ACCIMM,1,0,0> ;ADC immediate
opcode <0fch,018h,opn_sbb,OP_REGRMREG,2,0,0> ;SBB RM
opcode <0feh,01ch,opn_sbb,OP_ACCIMM,1,0,0> ;SBB immediate
opcode <0,0,0,0,0,0,0> ;group terminator
group001xxxxx label byte
opcode <0fch,020h,opn_and,OP_REGRMREG,2,0,0> ;AND RM
opcode <0feh,024h,opn_and,OP_ACCIMM,1,0,0> ;AND immediate
opcode <0ffh,027h,opn_daa,OP_CODEONLY,1,0,0> ;DAA
opcode <0fch,028h,opn_sub,OP_REGRMREG,2,0,0> ;SUB RM
opcode <0feh,02ch,opn_sub,OP_ACCIMM,1,0,0> ;SUB immediate
opcode <0ffh,02fh,opn_das,OP_CODEONLY,1,0,0> ;DAS
opcode <0fch,030h,opn_xor,OP_REGRMREG,2,0,0> ;XOR RM
opcode <0feh,034h,opn_xor,OP_ACCIMM,1,0,0> ;XOR immediate
opcode <0ffh,037h,opn_aaa,OP_CODEONLY,1,0,0> ;AAA
opcode <0fch,038h,opn_cmp,OP_REGRMREG,2,0,0> ;CMP RM
opcode <0feh,03ch,opn_cmp,OP_ACCIMM,1,0,0> ;CMP immediate
opcode <0ffh,03fh,opn_aas,OP_CODEONLY,1,0,0> ;AAS
opcode <0,0,0,0,0,0,0> ;group terminator
group010xxxxx label byte
opcode <0f8h,040h,opn_inc,OP_WREG02,1,0,0> ;INC
opcode <0f8h,048h,opn_dec,OP_WREG02,1,0,0> ;DEC
opcode <0f8h,050h,opn_push,OP_WREG02,1,0,0> ;PUSH
opcode <0f8h,058h,opn_pop,OP_WREG02,1,0,0> ;POP
opcode <0,0,0,0,0,0,0> ;group terminator
group011xxxxx label byte
opcode <0ffh,060h,opn_pusha,OP_INSWORDSIZE,1,1,0> ;PUSHA
opcode <0ffh,061h,opn_popa,OP_INSWORDSIZE,1,1,0> ;POPA
opcode <0ffh,062h,opn_bound,OP_WORDREGRM,2,1,0> ;BOUND
opcode <0ffh,063h,opn_arpl,OP_WORDRMREG,2,1,0> ;ARPL
opcode <0fdh,068h,opn_push,OP_IMM,1,1,0> ;PUSH imm
opcode <0fdh,069h,opn_imul,OP_IMUL,2,0,0> ;IMUL
opcode <0ffh,06ch,opn_insb,OP_CODEONLY,1,1,0> ;INSB
opcode <0ffh,06dh,opn_ins,OP_INSWORDSIZE,1,1,0> ;INS
opcode <0ffh,06eh,opn_outsb,OP_CODEONLY,1,1,0> ;OUTSB
opcode <0ffh,06fh,opn_outs,OP_INSWORDSIZE,1,1,0> ;OUTS
opcode <0ffh,070h,opn_jo,OP_SHORTBRANCH,2,0,0> ;JO
opcode <0ffh,071h,opn_jno,OP_SHORTBRANCH,2,0,0> ;JNO
opcode <0ffh,072h,opn_jb,OP_SHORTBRANCH,2,0,0> ;JB
opcode <0ffh,073h,opn_jnb,OP_SHORTBRANCH,2,0,0> ;JNB
opcode <0ffh,074h,opn_jz,OP_SHORTBRANCH,2,0,0> ;JZ
opcode <0ffh,075h,opn_jnz,OP_SHORTBRANCH,2,0,0> ;JNZ
opcode <0ffh,076h,opn_jbe,OP_SHORTBRANCH,2,0,0> ;JBE
opcode <0ffh,077h,opn_ja,OP_SHORTBRANCH,2,0,0> ;JA
opcode <0ffh,078h,opn_js,OP_SHORTBRANCH,2,0,0> ;JS
opcode <0ffh,079h,opn_jns,OP_SHORTBRANCH,2,0,0> ;JNS
opcode <0ffh,07ah,opn_jp,OP_SHORTBRANCH,2,0,0> ;JP
opcode <0ffh,07bh,opn_jnp,OP_SHORTBRANCH,2,0,0> ;JNP
opcode <0ffh,07ch,opn_jl,OP_SHORTBRANCH,2,0,0> ;JL
opcode <0ffh,07dh,opn_jge,OP_SHORTBRANCH,2,0,0> ;JGE
opcode <0ffh,07eh,opn_jle,OP_SHORTBRANCH,2,0,0> ;JLE
opcode <0ffh,07fh,opn_jg,OP_SHORTBRANCH,2,0,0> ;JG
opcode <0,0,0,0,0,0,0> ;terminator
group100xxxxx label byte
opcode <038fch,080h,opn_add,OP_RMIMMSIGNED,2,0,0> ;ADD
opcode <038feh,0880h,opn_or,OP_RMIMMSIGNED,2,0,0> ;OR
opcode <038fch,0880h,opn_or,OP_RMIMMSIGNED,2,0,0> ;OR
opcode <038fch,01080h,opn_adc,OP_RMIMMSIGNED,2,0,0> ;ADC
opcode <038fch,01880h,opn_sbb,OP_RMIMMSIGNED,2,0,0> ;SBB
opcode <038feh,02080h,opn_and,OP_RMIMMSIGNED,2,0,0> ;AND
opcode <038fch,02080h,opn_and,OP_RMIMMSIGNED,2,0,0> ;AND
opcode <038fch,02880h,opn_sub,OP_RMIMMSIGNED,2,0,0> ;SUB
opcode <038feh,03080h,opn_xor,OP_RMIMMSIGNED,2,0,0> ;XOR
opcode <038fch,03080h,opn_xor,OP_RMIMMSIGNED,2,0,0> ;XOR
opcode <038fch,03880h,opn_cmp,OP_RMIMMSIGNED,2,0,0> ;CMP
opcode <0feh,084h,opn_test,OP_REGMOD,2,0,0> ;TEST
opcode <0feh,086h,opn_xchg,OP_REGRM,2,0,0> ;XCHG
opcode <0fch,088h,opn_mov,OP_REGRMREG,2,0,0> ;MOV
opcode <020fdh,08ch,opn_mov,OP_SEGRMSEG,2,0,0> ;MOV
opcode <0fdh,08ch,opn_mov,OP_SEGRMSEG,2,0,0> ;MOV
opcode <0ffh,08dh,opn_lea,OP_WORDREGRM,2,0,0> ;LEA
opcode <038ffh,08fh,opn_pop,OP_PUSHW,2,0,0> ;POP
opcode <0ffh,090h,opn_nop,OP_CODEONLY,1,0,0> ;NOP
opcode <0f8h,090h,opn_xchg,OP_ACCREG02,1,0,0> ;XCHG
opcode <0ffh,098h,opn_cbw,OP_CBW,1,0,0> ;CBW
opcode <0ffh,099h,opn_cwd,OP_CODEONLY,1,0,0> ;CWD
opcode <0ffh,09ah,opn_call,OP_SEGBRANCH,5,0,0> ;CALL
opcode <0ffh,09bh,opn_wait,OP_CODEONLY,1,0,0> ;WAIT
opcode <0ffh,09ch,opn_pushf,OP_INSWORDSIZE,1,0,0> ;PUSHF
opcode <0ffh,09dh,opn_popf,OP_INSWORDSIZE,1,0,0> ;POPF
opcode <0ffh,09eh,opn_sahf,OP_CODEONLY,1,0,0> ;SAHF
opcode <0ffh,09fh,opn_lahf,OP_CODEONLY,1,0,0> ;LAHF
opcode <0,0,0,0,0,0,0> ;terminator
group101xxxxx label byte
opcode <0feh,0a0h,opn_mov,OP_ACCABS,3,0,0> ;MOV
opcode <0feh,0a2h,opn_mov,OP_ABSACC,3,0,0> ;MOV
opcode <0ffh,0a5h,opn_movs,OP_INSWORDSIZE,1,0,0> ;MOVS
opcode <0ffh,0a7h,opn_cmps,OP_INSWORDSIZE,1,0,0> ;CMPS
opcode <0feh,0a8h,opn_test,OP_ACCIMM,1,0,0> ;TEST
opcode <0ffh,0abh,opn_stos,OP_INSWORDSIZE,1,0,0> ;STOS
opcode <0ffh,0adh,opn_lods,OP_INSWORDSIZE,1,0,0> ;LODS
opcode <0ffh,0afh,opn_scas,OP_INSWORDSIZE,1,0,0> ;SCAS
opcode <0ffh,0a4h,opn_movsb,OP_CODEONLY,1,0,0> ;MOVSB
opcode <0ffh,0a6h,opn_cmpsb,OP_CODEONLY,1,0,0> ;CMPSB
opcode <0ffh,0aah,opn_stosb,OP_CODEONLY,1,0,0> ;STOSB
opcode <0ffh,0ach,opn_lodsb,OP_CODEONLY,1,0,0> ;LODSB
opcode <0ffh,0aeh,opn_scasb,OP_CODEONLY,1,0,0> ;SCASB
opcode <0f0h,0b0h,opn_mov,OP_ACCIMMB3,1,0,0> ;MOV
opcode <0,0,0,0,0,0,0> ;terminator
group110xxxxx label byte
opcode <038feh,0c0h,opn_rol,OP_RMSHIFT,2,1,0> ;ROL
opcode <038feh,08c0h,opn_ror,OP_RMSHIFT,2,1,0> ;ROR
opcode <038feh,010c0h,opn_rcl,OP_RMSHIFT,2,1,0> ;RCL
opcode <038feh,018c0h,opn_rcr,OP_RMSHIFT,2,1,0> ;RCR
opcode <038feh,020c0h,opn_shl,OP_RMSHIFT,2,1,0> ;SHL
opcode <038feh,028c0h,opn_shr,OP_RMSHIFT,2,1,0> ;SHR
opcode <038feh,038c0h,opn_sar,OP_RMSHIFT,2,1,0> ;SAR
opcode <0ffh,0c2h,opn_ret,OP_RET,3,0,0> ;RET
opcode <0ffh,0c3h,opn_ret,OP_CODEONLY,1,0,0> ;RET
opcode <0ffh,0c4h,opn_les,OP_WORDREGRM,2,0,0> ;LES
opcode <0ffh,0c5h,opn_lds,OP_WORDREGRM,2,0,0> ;LDS
opcode <038feh,0c6h,opn_mov,OP_RMIMM,2,0,0> ;MOV
opcode <0ffh,0c8h,opn_enter,OP_ENTER,4,1,0> ;ENTER
opcode <0ffh,0cah,opn_retf,OP_RET,3,0,0> ;RETF
opcode <0ffh,0cbh,opn_retf,OP_CODEONLY,1,0,0> ;RETF
opcode <0ffh,0cch,opn_int,OP_INTR,1,0,0> ;INT
opcode <0ffh,0cdh,opn_int,OP_INTR,2,0,0> ;INT
opcode <0ffh,0ceh,opn_into,OP_CODEONLY,1,0,0> ;INTO
opcode <0ffh,0cfh,opn_iret,OP_CODEONLY,1,0,0> ;IRET
opcode <0ffh,0c9h,opn_leave,OP_CODEONLY,1,1,0> ;LEAVE
opcode <038fch,0d0h,opn_rol,OP_RMSHIFT,2,0,0> ;ROL
opcode <038fch,08d0h,opn_ror,OP_RMSHIFT,2,0,0> ;ROR
opcode <038fch,010d0h,opn_rcl,OP_RMSHIFT,2,0,0> ;RCL
opcode <038fch,018d0h,opn_rcr,OP_RMSHIFT,2,0,0> ;RCR
opcode <038fch,020d0h,opn_shl,OP_RMSHIFT,2,0,0> ;SHL
opcode <038fch,028d0h,opn_shr,OP_RMSHIFT,2,0,0> ;SHR
opcode <038fch,038d0h,opn_sar,OP_RMSHIFT,2,0,0> ;SAR
opcode <0ffffh,0ad4h,opn_aam,OP_CODEONLY,2,0,0> ;AAM
opcode <0ffffh,0ad5h,opn_aad,OP_CODEONLY,2,0,0> ;AAD
opcode <0ffh,0d7h,opn_xlat,OP_CODEONLY,1,0,0> ;XLAT
opcode <0,0,0,0,0,0,0>
group111xxxxx label byte
opcode <0ffh,0e0h,opn_loopnz,OP_SHORTBRANCH,2,0,0> ;LOOPNZ
opcode <0ffh,0e1h,opn_loopz,OP_SHORTBRANCH,2,0,0> ;LOOPZ
opcode <0ffh,0e2h,opn_loop,OP_SHORTBRANCH,2,0,0> ;LOOP
opcode <0ffh,0e3h,opn_jcxz,OP_SHORTBRANCH,2,0,0> ;JCXZ
opcode <0feh,0e4h,opn_in,OP_PORTACCPORT,2,0,0> ;IN
opcode <0feh,0e6h,opn_out,OP_PORTACCPORT,2,0,0> ;OUT
opcode <0ffh,0e8h,opn_call,OP_BRANCH,3,0,0> ;CALL
opcode <0ffh,0e9h,opn_jmp,OP_BRANCH,3,0,0> ;JMP
opcode <0ffh,0eah,opn_jmp,OP_SEGBRANCH,5,0,0> ;JMP
opcode <0ffh,0ebh,opn_jmp,OP_SHORTBRANCH,2,0,0> ;JMP
opcode <0feh,0ech,opn_in,OP_ACCDX,1,0,0> ;IN
opcode <0feh,0eeh,opn_out,OP_DXACC,1,0,0> ;OUT
opcode <0ffh,0f0h,opn_lock,OP_CODEONLY,1,0,0> ;LOCK
opcode <0ffh,0f2h,opn_repnz,OP_CODEONLY,1,0,0> ;REPNZ
opcode <0ffh,0f3h,opn_repz,OP_CODEONLY,1,0,0> ;REPZ
opcode <0ffh,0f4h,opn_hlt,OP_CODEONLY,1,0,0> ;HLT
opcode <0ffh,0f5h,opn_cmc,OP_CODEONLY,1,0,0> ;CMC
opcode <038feh,0f6h,opn_test,OP_RMIMM,2,0,0> ;TEST
opcode <038feh,010f6h,opn_not,OP_RM ,2,0,0> ;NOT
opcode <038feh,018f6h,opn_neg,OP_RM ,2,0,0> ;NEG
opcode <038feh,020f6h,opn_mul,OP_RM ,2,0,0> ;MUL
opcode <038feh,028f6h,opn_imul,OP_RM ,2,0,0> ;IMUL
opcode <038feh,030f6h,opn_div,OP_RM ,2,0,0> ;DIV
opcode <038feh,038f6h,opn_idiv,OP_RM ,2,0,0> ;IDIV
opcode <0ffh,0f8h,opn_clc,OP_CODEONLY,1,0,0> ;CLC
opcode <0ffh,0f9h,opn_stc,OP_CODEONLY,1,0,0> ;STC
opcode <0ffh,0fah,opn_cli,OP_CODEONLY,1,0,0> ;CLI
opcode <0ffh,0fbh,opn_sti,OP_CODEONLY,1,0,0> ;STI
opcode <0ffh,0fch,opn_cld,OP_CODEONLY,1,0,0> ;CLD
opcode <0ffh,0fdh,opn_std,OP_CODEONLY,1,0,0> ;STD
opcode <038feh,0feh,opn_inc,OP_RM ,2,0,0> ;INC
opcode <038feh,08feh,opn_dec,OP_RM ,2,0,0> ;DEC
opcode <038ffh,010ffh,opn_call,OP_RM ,2,0,0> ;CALL
opcode <038ffh,018ffh,opn_call,OP_FARRM ,2,0,0> ;CALL
opcode <038ffh,020ffh,opn_jmp,OP_RM ,2,0,0> ;JMP
opcode <038ffh,028ffh,opn_jmp,OP_FARRM ,2,0,0> ;JMP
opcode <038ffh,030ffh,opn_push,OP_PUSHW,2,0,0> ;PUSH
opcode <0,0,0,0,0,0,0>
groupx386 label byte
opcode <0feh,0beh,opn_movsx,OP_MIXEDREGRM,2,3,0> ;MOVSX
opcode <0feh,0b6h,opn_movzx,OP_MIXEDREGRM,2,3,0> ;MOVZX
opcode <0f8h,0c8h,opn_bswap,OP_BSWAP,1,3,0> ;BSWAP
opcode <0f7h,0a0h,opn_push,OP_SEG35,1,3,0> ;PUSH
opcode <0f7h,0a1h,opn_pop,OP_SEG35,1,3,0> ;POP
opcode <0ffh,0b4h,opn_lfs,OP_WORDREGRM,2,3,0> ;LFS
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -