123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #![allow(non_snake_case)]
- use cpu_context::CpuContext;
- use prefix::{PREFIX_66, PREFIX_67, PREFIX_F2, PREFIX_F3};
- use regs::{CS, DS, ES, FS, GS, SS};
- #[derive(PartialEq, Eq)]
- pub enum AnalysisType {
- Normal,
- BlockBoundary,
- Jump {
- offset: i32,
- is_32: bool,
- condition: Option<u8>,
- },
- STI,
- }
- pub struct Analysis {
- pub no_next_instruction: bool,
- pub absolute_jump: bool,
- pub ty: AnalysisType,
- }
- pub fn analyze_step(mut cpu: &mut CpuContext) -> Analysis {
- let mut analysis = Analysis {
- no_next_instruction: false,
- absolute_jump: false,
- ty: AnalysisType::Normal,
- };
- cpu.prefixes = 0;
- let opcode = cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8;
- ::gen::analyzer::analyzer(opcode, &mut cpu, &mut analysis);
- analysis
- }
- pub fn analyze_step_handle_prefix(cpu: &mut CpuContext, analysis: &mut Analysis) {
- ::gen::analyzer::analyzer(
- cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8,
- cpu,
- analysis,
- )
- }
- pub fn analyze_step_handle_segment_prefix(
- segment: u32,
- cpu: &mut CpuContext,
- analysis: &mut Analysis,
- ) {
- dbg_assert!(segment <= 5);
- cpu.prefixes |= segment + 1;
- analyze_step_handle_prefix(cpu, analysis)
- }
- pub fn instr16_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- ::gen::analyzer0f::analyzer(cpu.read_imm8() as u32, cpu, analysis)
- }
- pub fn instr32_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- ::gen::analyzer0f::analyzer(cpu.read_imm8() as u32 | 0x100, cpu, analysis)
- }
- pub fn instr_26_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- analyze_step_handle_segment_prefix(ES, cpu, analysis)
- }
- pub fn instr_2E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- analyze_step_handle_segment_prefix(CS, cpu, analysis)
- }
- pub fn instr_36_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- analyze_step_handle_segment_prefix(SS, cpu, analysis)
- }
- pub fn instr_3E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- analyze_step_handle_segment_prefix(DS, cpu, analysis)
- }
- pub fn instr_64_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- analyze_step_handle_segment_prefix(FS, cpu, analysis)
- }
- pub fn instr_65_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- analyze_step_handle_segment_prefix(GS, cpu, analysis)
- }
- pub fn instr_66_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- cpu.prefixes |= PREFIX_66;
- analyze_step_handle_prefix(cpu, analysis)
- }
- pub fn instr_67_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- cpu.prefixes |= PREFIX_67;
- analyze_step_handle_prefix(cpu, analysis)
- }
- pub fn instr_F0_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- // lock: Ignored
- analyze_step_handle_prefix(cpu, analysis)
- }
- pub fn instr_F2_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- cpu.prefixes |= PREFIX_F2;
- analyze_step_handle_prefix(cpu, analysis)
- }
- pub fn instr_F3_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
- cpu.prefixes |= PREFIX_F3;
- analyze_step_handle_prefix(cpu, analysis)
- }
- pub fn modrm_analyze(ctx: &mut CpuContext, modrm_byte: u8) { ::modrm::skip(ctx, modrm_byte); }
|