windows-nt/Source/XPSP1/NT/base/wow64/mscpu/decoder/ds32tbl.c
2020-09-26 16:20:57 +08:00

618 lines
8 KiB
C

/*++
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
ds32tbl.c
Abstract:
Dispatch tables for instructions with no DATA: override. It is used for
both DS: and FS: overrides.
Author:
29-Jun-1995 BarryBo
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include "threadst.h"
#include "instr.h"
#include "decoderp.h"
#include "bytefns.h"
#include "dwordfns.h"
#include "miscfns.h"
#include "floatfns.h"
pfnDispatchInstruction Dispatch32[256] = {
// 0
add_m_r8,
add_m_r32,
add_r_m8,
add_r_m32,
add_a_i8,
add_a_i32,
push_es,
pop_es,
// 8
or_m_r8,
or_m_r32,
or_r_m8,
or_r_m32,
or_a_i8,
or_a_i32,
push_cs,
dispatch232,
// 10
adc_m_r8,
adc_m_r32,
adc_r_m8,
adc_r_m32,
adc_a_i8,
adc_a_i32,
push_ss,
pop_ss,
// 18
sbb_m_r8,
sbb_m_r32,
sbb_r_m8,
sbb_r_m32,
sbb_a_i8,
sbb_a_i32,
push_ds,
pop_ds,
// 20
and_m_r8,
and_m_r32,
and_r_m8,
and_r_m32,
and_a_i8,
and_a_i32,
ProcessPrefixes, // es:
daa,
// 28
sub_m_r8,
sub_m_r32,
sub_r_m8,
sub_r_m32,
sub_a_i8,
sub_a_i32,
ProcessPrefixes, // cs:
das,
// 30
xor_m_r8,
xor_m_r32,
xor_r_m8,
xor_r_m32,
xor_a_i8,
xor_a_i32,
ProcessPrefixes, // ss:
aaa,
// 38
cmp_m_r8,
cmp_m_r32,
cmp_r_m8,
cmp_r_m32,
cmp_a_i8,
cmp_a_i32,
ProcessPrefixes, // ds:
aas,
// 40
inc_ax32,
inc_cx32,
inc_dx32,
inc_bx32,
inc_sp32,
inc_bp32,
inc_si32,
inc_di32,
// 48
dec_ax32,
dec_cx32,
dec_dx32,
dec_bx32,
dec_sp32,
dec_bp32,
dec_si32,
dec_di32,
// 50
push_ax32,
push_cx32,
push_dx32,
push_bx32,
push_sp32,
push_bp32,
push_si32,
push_di32,
// 58
pop_ax32,
pop_cx32,
pop_dx32,
pop_bx32,
pop_sp32,
pop_bp32,
pop_si32,
pop_di32,
// 60
pusha32,
popa32,
bound32,
arpl,
ProcessPrefixes, // fs:
ProcessPrefixes, // gs:
ProcessPrefixes, // data: prefix
ProcessPrefixes, // adr: prefix
// 68
push_iw32,
imul_rw_m_iw32,
push_ibs32,
imul_rw_m_ib32,
privileged, // in_ib_dx
privileged, // in_iw_dx
privileged, // out_ib_dx
privileged, // out_iw_dx
// 70
jo8,
jno8,
jb8,
jae8,
je8,
jne8,
jbe8,
ja8,
// 78
js8,
jns8,
jp8,
jnp8,
jl8,
jnl8,
jle8,
jg8,
// 80
GROUP_18,
GROUP_132,
bad,
GROUP_1WS32,
test_r_m8,
test_r_m32,
xchg_r_m8,
xchg_r_m32,
// 88
mov_m_r8,
mov_m_r32,
mov_r_m8,
mov_r_m32,
mov_mw_seg,
lea_rw_mw32,
mov_seg_mw,
pop_mw32,
// 90
nop,
xchg_ax_cx32,
xchg_ax_dx32,
xchg_ax_bx32,
xchg_ax_sp32,
xchg_ax_bp32,
xchg_ax_si32,
xchg_ax_di32,
// 98
cbw32,
cwd32,
call_md,
wait,
pushf32,
popf32,
sahf,
lahf,
// a0
mov_a_m8,
mov_a_m32,
mov_m_a8,
mov_m_a32,
movs8,
movs32,
cmps8,
cmps32,
// a8
test_a_i8,
test_a_i32,
stos8,
stos32,
lods8,
lods32,
scas8,
scas32,
// b0
mov_a_i8,
mov_c_i8,
mov_d_i8,
mov_b_i8,
mov_ah_ib,
mov_ch_ib,
mov_dh_ib,
mov_bh_ib,
// b8
mov_a_i32,
mov_c_i32,
mov_d_i32,
mov_b_i32,
mov_sp_iw32,
mov_bp_iw32,
mov_si_iw32,
mov_di_iw32,
// c0
GROUP_28,
GROUP_232,
retn_i32,
retn32,
les_rw_mw32,
lds_rw_mw32,
mov_m_i8,
mov_m_i32,
// c8
enter32,
leave32,
retf_i32,
retf32,
int3,
int_ib,
into,
iret,
// d0
GROUP_2_18,
GROUP_2_132,
GROUP_2_CL8,
GROUP_2_CL32,
aam_ib,
aad_ib,
bad,
xlat,
// d8
FLOAT_GP0,
FLOAT_GP1,
FLOAT_GP2,
FLOAT_GP3,
FLOAT_GP4,
FLOAT_GP5,
FLOAT_GP6,
FLOAT_GP7,
// e0
loopne_b32,
loope_b32,
loop_b32,
jcxz_b32,
privileged, // in_al_memb
privileged, // in_ax_memb
privileged, // out_memb_al
privileged, // out_memb_ax
// e8
call_rel32,
jmp_rel32,
jmpf_md,
jmp_jb,
privileged, // in_al_dx
privileged, // in_ax_dx
privileged, // out_dx_al
privileged, // out_dx_ax
// f0
ProcessPrefixes, // lock: prefix
bad,
ProcessPrefixes, // repnz prefix
ProcessPrefixes, // repz prefix
privileged, // halt
cmc,
GROUP_38,
GROUP_332,
// f8
clc,
stc,
privileged, // cli
privileged, // sti
cld,
std,
GROUP_4,
GROUP_532
};
pfnDispatchInstruction Dispatch232[256] = {
// 0
GROUP_6,
GROUP_7,
lar32,
lsl32,
bad,
bad,
privileged, // clts
bad,
// 8
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 10
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 18
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 20
privileged, // mov reg2W, eeeControl
privileged, // mov reg2W, eeeDebug
privileged, // mov eeeControl, reg2W
privileged, // mov eeeDebug, reg2W
privileged, // mov reg2W, eeeTest
bad,
privileged, // mov eeeTest, reg2W
bad,
// 28
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 30
bad,
rdtsc,
bad,
bad,
bad,
bad,
bad,
bad,
// 38
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 40
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 48
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 50
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 58
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 60
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 68
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 70
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 78
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// 80
jo32,
jno32,
jb32,
jae32,
je32,
jne32,
jbe32,
ja32,
// 88
js32,
jns32,
jp32,
jnp32,
jl32,
jnl32,
jle32,
jg32,
// 90
seto_modrmb,
setno_modrmb,
setb_modrmb,
setae_modrmb,
sete_modrmb,
setne_modrmb,
setbe_modrmb,
seta_modrmb,
// 98
sets_modrmb,
setns_modrmb,
setp_modrmb,
setnp_modrmb,
setl_modrmb,
setge_modrmb,
setle_modrmb,
setg_modrmb,
// a0
push_fs,
pop_fs,
cpuid,
bt_m_r32,
shld_regw_modrmw_immb32,
shld_regw_modrmw_cl32,
bad,
bad,
// a8
push_gs,
pop_gs,
bad,
bts_m_r32,
shrd_regw_modrmw_immb32,
shrd_regw_modrmw_cl32,
bad,
imul_regw_modrmw32,
// b0
cmpxchg_m_r8,
cmpxchg_m_r32,
lss_rw_mw32,
btr_m_r32,
lfs_rw_mw32,
lgs_rw_mw32,
movzx_regw_modrmb32,
movzx_regw_modrmw,
// b8
bad,
bad,
GROUP_832,
btc_m_r32,
bsf_modrmw_regw32,
bsr_modrmw_regw32,
movsx_regw_modrmb32,
movsx_regw_modrmw,
// c0
xadd_m_r8,
xadd_m_r32,
bad,
bad,
bad,
bad,
bad,
cmpxchg8b,
// c8
bswap_eax,
bswap_ecx,
bswap_edx,
bswap_ebx,
bswap_esp,
bswap_ebp,
bswap_esi,
bswap_edi,
// d0
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// d8
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// e0
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// e8
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// f0
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad,
// f8
bad,
bad,
bad,
bad,
bad,
bad,
bad,
bad
};