--- /dev/null
+/*BEGIN_LEGAL
+Intel Open Source License
+
+Copyright (c) 2002-2007 Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer. Redistributions
+in binary form must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution. Neither the name of
+the Intel Corporation nor the names of its contributors may be used to
+endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR
+ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+END_LEGAL */
+/// @file xed-ex2.cpp
+/// @author Mark Charney <mark.charney@intel.com>
+
+// decoder example. C++ version of xed-ex4.c
+
+extern "C" {
+#include "xed-interface.h"
+}
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+#include <cassert>
+using namespace std;
+
+int main(int argc, char** argv);
+
+int main(int argc, char** argv) {
+ xed_bool_t long_mode = false;
+ xed_state_t dstate;
+ int first_argv;
+ int bytes = 0;
+ unsigned char itext[XED_MAX_INSTRUCTION_BYTES];
+ int i;
+ unsigned int u;
+ xed_decoded_inst_t xedd;
+#define BUFLEN 1000
+ char buffer[BUFLEN];
+
+ xed_tables_init();
+ xed_state_zero(&dstate);
+ xed_set_verbosity( 99 );
+
+ if (argc > 2 && strcmp(argv[1], "-64") == 0)
+ long_mode = true;
+
+ if (long_mode) {
+ first_argv = 2;
+ dstate.mmode=XED_MACHINE_MODE_LONG_64;
+ }
+ else {
+ first_argv=1;
+ xed_state_init(&dstate,
+ XED_MACHINE_MODE_LEGACY_32,
+ XED_ADDRESS_WIDTH_32b,
+ XED_ADDRESS_WIDTH_32b);
+ }
+ xed_decoded_inst_zero_set_mode(&xedd, &dstate);
+ for( i=first_argv ;i < argc; i++) {
+ unsigned int x;
+ istringstream s(argv[i]);
+ s >> hex >> x;
+
+ assert(bytes < XED_MAX_INSTRUCTION_BYTES);
+ itext[bytes++] = STATIC_CAST(xed_uint8_t,x);
+ }
+ if (bytes == 0) {
+ cout << "Must supply some hex bytes" << endl;
+ exit(1);
+ }
+
+ cout << "PARSING BYTES: ";
+ for( i=0;i<bytes; i++)
+ cout << hex << setw(2) << setfill('0')
+ << STATIC_CAST(unsigned int,itext[i]) << " ";
+ cout << endl << setfill(' ');
+
+ xed_error_enum_t xed_error = xed_decode(&xedd,
+ REINTERPRET_CAST(xed_uint8_t*,itext),
+ bytes);
+ switch(xed_error)
+ {
+ case XED_ERROR_NONE:
+ break;
+ case XED_ERROR_BUFFER_TOO_SHORT:
+ cout << "Not enough bytes provided" << endl;
+ exit(1);
+ case XED_ERROR_GENERAL_ERROR:
+ cout << "Could not decode given input." << endl;
+ exit(1);
+ default:
+ cout << "Unhandled error code " << xed_error_enum_t2str(xed_error) << endl;
+ exit(1);
+ }
+
+ xed_decoded_inst_dump(&xedd,buffer,BUFLEN);
+ cout << buffer << endl;
+
+ xed_bool_t ok;
+ for(u= XED_SYNTAX_XED; u < XED_SYNTAX_LAST; u++) {
+ xed_syntax_enum_t syntax = static_cast<xed_syntax_enum_t>(u);
+ ok = xed_format(syntax, &xedd, buffer, BUFLEN, 0);
+ if (ok)
+ cout << xed_syntax_enum_t2str(syntax) << " syntax: " << buffer << endl;
+ else
+ cout << "Error disassembling " << xed_syntax_enum_t2str(syntax) << " syntax" << endl;
+ }
+ return 0;
+}