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

📄 opcodes.asm

📁 比dos下的debug更好的debug程序源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;
; 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 + -