3
#include <boost/regex.hpp>
5
#include "kdlib/disasm.h"
6
#include "kdlib/disasmengine.h"
7
#include "kdlib/dbgengine.h"
8
#include "kdlib/exceptions.h"
9
#include "kdlib/memaccess.h"
11
/////////////////////////////////////////////////////////////////////////////////
15
static const boost::wregex opcodeRegex(L"^[0-9a-fA-F`]+\\s+[0-9a-fA-F]+\\s+(.*)$");
19
/////////////////////////////////////////////////////////////////////////////////
23
/////////////////////////////////////////////////////////////////////////////////
25
Disasm::Disasm( MEMOFFSET_64 offset )
28
m_beginOffset = addr64(offset);
30
if ( m_beginOffset == 0 )
31
m_beginOffset = getInstructionOffset();
33
m_currentOffset = m_beginOffset;
38
/////////////////////////////////////////////////////////////////////////////////
40
void Disasm::doDisasm()
42
MEMOFFSET_64 endOffset = 0;
44
disasmDisassembly( m_currentOffset, m_disasm, endOffset, m_ea );
46
m_length = (size_t)(endOffset - m_currentOffset);
49
/////////////////////////////////////////////////////////////////////////////////
51
std::wstring Disasm::assembly( const std::wstring &instr )
53
MEMOFFSET_64 endOffset = 0;
54
disasmAssemblay( m_currentOffset, instr, endOffset );
56
m_currentOffset = endOffset;
63
/////////////////////////////////////////////////////////////////////////////////
65
MEMOFFSET_64 Disasm::getNearInstruction( MEMDISPLACEMENT delta ) {
66
return kdlib::getNearInstruction( m_currentOffset, delta );
69
/////////////////////////////////////////////////////////////////////////////////
71
std::wstring Disasm::opmnemo() const
73
boost::wsmatch matchResult;
75
if (!boost::regex_match(m_disasm, matchResult, opcodeRegex))
76
throw DbgException("failed to parse instruction");
78
return std::wstring(matchResult[1].first, matchResult[1].second);
81
/////////////////////////////////////////////////////////////////////////////////
83
std::vector<unsigned char> Disasm::opcode() const
85
return loadBytes(m_currentOffset, m_length);
88
/////////////////////////////////////////////////////////////////////////////////
90
}; // end kdlib namespace