--- /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-ex3.cpp
+/// @author Mark Charney <mark.charney@intel.com>
+
+/// Encoder example
+
+
+extern "C" {
+#include "xed-interface.h"
+#include "xed-examples-util.h"
+}
+#include "xed-enc-lang.H"
+#include <iostream>
+#include <iomanip>
+#include <string>
+#include <sstream>
+using namespace std;
+
+int main(int argc, char** argv);
+
+
+void
+usage(char* progname)
+{
+ cerr << "Usage: " << progname << " [-16|-32|-64] [-a16|-a32] [-s16|-s32] encode-string" << endl;
+ exit(1);
+}
+
+ascii_encode_request_t
+parse_args(unsigned int argc, char** argv)
+{
+ if (argc == 1)
+ usage(argv[0]);
+
+ ascii_encode_request_t r;
+ r.dstate.mmode = XED_MACHINE_MODE_LEGACY_32;
+ r.dstate.addr_width = XED_ADDRESS_WIDTH_32b;
+ r.dstate.stack_addr_width = XED_ADDRESS_WIDTH_32b;
+ string c = "";
+ unsigned int i = 1;
+
+ for( ; i< argc; i++)
+ if (strcmp(argv[i],"-16")==0)
+ r.dstate.mmode = XED_MACHINE_MODE_LEGACY_16;
+ else if (strcmp(argv[i],"-32")==0)
+ r.dstate.mmode = XED_MACHINE_MODE_LEGACY_32;
+ else if (strcmp("-64", argv[i]) == 0) {
+ r.dstate.mmode = XED_MACHINE_MODE_LONG_64;
+ r.dstate.addr_width = XED_ADDRESS_WIDTH_64b;
+ }
+ else if (strcmp("-32", argv[i]) == 0)
+ r.dstate.mmode = XED_MACHINE_MODE_LEGACY_32;
+ else if (strcmp("-16", argv[i]) == 0)
+ r.dstate.mmode = XED_MACHINE_MODE_LEGACY_16;
+ else if (strcmp(argv[i],"-a32")==0)
+ r.dstate.addr_width = XED_ADDRESS_WIDTH_32b;
+ else if (strcmp(argv[i],"-a16")==0)
+ r.dstate.addr_width = XED_ADDRESS_WIDTH_16b;
+ else if (strcmp(argv[i],"-s32")==0)
+ r.dstate.stack_addr_width = XED_ADDRESS_WIDTH_32b;
+ else if (strcmp(argv[i],"-s16")==0)
+ r.dstate.stack_addr_width = XED_ADDRESS_WIDTH_16b;
+ else
+ break;
+
+ if (i == argc)
+ usage(argv[0]);
+
+ for( ;i<argc;i++)
+ c = c + " " + argv[i];
+
+ r.command = c.c_str();
+ return r;
+}
+
+int main(int argc, char** argv) {
+ char buf[5000];
+ xed_tables_init();
+ ascii_encode_request_t areq = parse_args(argc,argv);
+ xed_encoder_request_t req = parse_encode_request(areq);
+
+ cout << "Encode request:" << endl;
+ xed_encode_request_print(&req, buf, 5000);
+ cout << buf << endl;
+
+ unsigned int ilen = XED_MAX_INSTRUCTION_BYTES;
+ unsigned int olen;
+ xed_uint8_t array[XED_MAX_INSTRUCTION_BYTES];
+
+ xed_error_enum_t xed_error = xed_encode(&req, array, ilen, &olen);
+ xed_bool_t encode_okay = ( xed_error == XED_ERROR_NONE);
+ if (!encode_okay) {
+ cout << "Could not encode" << endl;
+ return 1;
+ }
+ xed_print_hex_line(buf, array, olen);
+ cout << "Encodable! " << buf << endl;
+
+//#define TEST_DISPLACEMENT_MODIFICATION
+//#define TEST_IMMEDIATE_MODIFICATION
+#if defined(TEST_DISPLACEMENT_MODIFICATION) || defined(TEST_IMMEDIATE_MODIFICATION)
+# if defined(TEST_DISPLACEMENT_MODIFICATION)
+ if (req.has_disp())
+ {
+ INT64 new_disp = 0x11223344;
+ unsigned int new_disp_length = 4;
+ xed_bool_t update_okay = req.update_displacement(new_disp, new_disp_length, array);
+# elif defined(TEST_IMMEDIATE_MODIFICATION)
+ if (req.has_immed())
+ {
+ INT64 new_immed = 0x11223344;
+ unsigned int new_immed_length = 4;
+ xed_bool_t update_okay = req.update_immediate(new_immed, new_immed_length, array);
+# endif
+ if (update_okay)
+ {
+ cout << "Update succeeded" << endl;
+ ostringstream os;
+ print_hex_line(os, array, olen);
+ cout << os.str() << endl;
+ }
+ else
+ cout << "Update failed" << endl;
+ }
+#endif
+ return 0;
+}