/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexander V. Astapchuk
*/
/**
* @file
* @brief Main decoding (disassembling) routines and structures.
*
* @note Quick and rough implementation, subject for a change.
*/
#ifndef __DEC_BASE_H_INCLUDED__
#define __DEC_BASE_H_INCLUDED__
#include "enc_base.h"
#include "enc_prvt.h"
#ifdef ENCODER_ISOLATE
using namespace enc_ia32;
#endif
#define IF_CONDITIONAL (0x00000000)
#define IF_SYMMETRIC (0x00000000)
#define IF_BRANCH (0x00000000)
struct Inst {
Inst() {
mn = Mnemonic_Null;
prefc = 0;
size = 0;
flags = 0;
//offset = 0;
//direct_addr = NULL;
argc = 0;
for(int i = 0; i < 4; ++i)
{
pref[i] = InstPrefix_Null;
}
}
/**
* Mnemonic of the instruction.s
*/
Mnemonic mn;
/**
* Enumerating of indexes in the pref array.
*/
enum PrefGroups
{
Group1 = 0,
Group2,
Group3,
Group4
};
/**
* Number of prefixes (1 byte each).
*/
unsigned int prefc;
/**
* Instruction prefixes. Prefix should be placed here according to its group.
*/
InstPrefix pref[4];
/**
* Size, in bytes, of the instruction.
*/
unsigned size;
/**
* Flags of the instruction.
* @see MF_
*/
unsigned flags;
/**
* An offset of target address, in case of 'CALL offset',
* 'JMP/Jcc offset'.
*/
//int offset;
/**
* Direct address of the target (on Intel64/IA-32 is 'instruction IP' +
* 'instruction length' + offset).
*/
//void * direct_addr;
/**
* Number of arguments of the instruction.
*/
unsigned argc;
//
EncoderBase::Operand operands[3];
//
const EncoderBase::OpcodeDesc * odesc;
};
inline bool is_jcc(Mnemonic mn)
{
return Mnemonic_JO <= mn && mn<=Mnemonic_JG;
}
class DecoderBase {
public:
static unsigned decode(const void * addr, Inst * pinst);
private:
static bool decodeModRM(const EncoderBase::OpcodeDesc& odesc,
const unsigned char ** pbuf, Inst * pinst
#ifdef _EM64T_
, const Rex *rex
#endif
);
static bool decode_aux(const EncoderBase::OpcodeDesc& odesc,
unsigned aux, const unsigned char ** pbuf,
Inst * pinst
#ifdef _EM64T_
, const Rex *rex
#endif
);
static bool try_mn(Mnemonic mn, const unsigned char ** pbuf, Inst * pinst);
static unsigned int fill_prefs( const unsigned char * bytes, Inst * pinst);
static bool is_prefix(const unsigned char * bytes);
};
#endif // ~ __DEC_BASE_H_INCLUDED__