xed_uint_t disas_decode_binary(const xed_state_t* dstate, const xed_uint8_t* hex_decode_text, const unsigned int bytes, xed_decoded_inst_t* xedd, xed_uint64_t runtime_address) { xed_uint64_t t1,t2; xed_error_enum_t xed_error; xed_bool_t okay; if (CLIENT_VERBOSE) { print_hex_line(hex_decode_text, bytes); } t1 = xed_get_time(); xed_error = xed_decode(xedd, hex_decode_text, bytes); t2 = xed_get_time(); okay = (xed_error == XED_ERROR_NONE); if (CLIENT_VERBOSE3) { xed_uint64_t delta = t2-t1; printf("Decode time = " XED_FMT_LU "\n", delta); } if (okay) { if (CLIENT_VERBOSE1) { char tbuf[XED_TMP_BUF_LEN]; xed_decoded_inst_dump(xedd,tbuf,XED_TMP_BUF_LEN); printf("%s\n",tbuf); } if (CLIENT_VERBOSE) { char buf[XED_TMP_BUF_LEN]; if (xed_decoded_inst_valid(xedd)) { printf( "ICLASS: %s CATEGORY: %s EXTENSION: %s IFORM: %s" " ISA_SET: %s\n", xed_iclass_enum_t2str(xed_decoded_inst_get_iclass(xedd)), xed_category_enum_t2str(xed_decoded_inst_get_category(xedd)), xed_extension_enum_t2str(xed_decoded_inst_get_extension(xedd)), xed_iform_enum_t2str(xed_decoded_inst_get_iform_enum(xedd)), xed_isa_set_enum_t2str(xed_decoded_inst_get_isa_set(xedd))); } memset(buf,0,XED_TMP_BUF_LEN); disassemble(buf,XED_TMP_BUF_LEN, xedd, runtime_address,0); printf("SHORT: %s\n", buf); } return 1; } else { xed_decode_error(0, 0, hex_decode_text, xed_error); return 0; } (void) dstate; // pacify compiler }
void print_ild(const xed_decoded_inst_t* p) { char buf[BUFLEN]; xed_decoded_inst_dump(p, buf, BUFLEN); printf("%s\n", buf); /* XDPRINT(length); XDPRINT(nprefixes); XDPRINT(found); XDPRINT(osz); XDPRINT(asz); XXPRINT(seg); XDPRINT(lock); XDPRINT(f2); XDPRINT(f3); XXPRINT(last_f2f3); XXPRINT(first_f2f3); XXPRINT(rex); XXPRINT(nominal_opcode); XDPRINT(nominal_opcode_position); XXPRINT(modrm); XXPRINT(has_modrm); XXPRINT(pos_modrm); XXPRINT(has_sib); XXPRINT(pos_sib); XXPRINT(disp_bytes); XXPRINT(pos_disp); XXPRINT(imm_bytes); XXPRINT(imm1_bytes); XXPRINT(pos_imm); XDPRINT(map); XDPRINT(amd3dnow); XDPRINT(rex_w); XDPRINT(rex_r); XDPRINT(rex_x); XDPRINT(rex_b); XDPRINT(vex_l); XDPRINT(vex_pp); XDPRINT(vex_w); */ }
void x86_dump_ins(void *ins) { xed_decoded_inst_t xedd; xed_decoded_inst_t *xptr = &xedd; xed_error_enum_t xed_error; char inst_buf[1024]; char errbuf[2048]; xed_decoded_inst_zero_set_mode(xptr, &x86_decoder_settings.xed_settings); xed_error = xed_decode(xptr, (uint8_t*) ins, 15); if (xed_error == XED_ERROR_NONE) { xed_decoded_inst_dump(xptr, inst_buf, sizeof(inst_buf)); sprintf(errbuf, "(%p, %d bytes, %s) %s \n" , ins, xed_decoded_inst_get_length(xptr), xed_iclass_enum_t2str(iclass(xptr)), inst_buf); } else { #if defined(ENABLE_XOP) && defined (HOST_CPU_x86_64) amd_decode_t decode_res; adv_amd_decode(&decode_res, ins); if (decode_res.success) { if (decode_res.weak) sprintf(errbuf, "(%p, %d bytes) weak AMD XOP \n", ins, (int) decode_res.len); else sprintf(errbuf, "(%p, %d bytes) robust AMD XOP \n", ins, (int) decode_res.len); } else #endif // ENABLE_XOP and HOST_CPU_x86_64 sprintf(errbuf, "x86_dump_ins: xed decode error addr=%p, code = %d\n", ins, (int) xed_error); } EMSG(errbuf); fprintf(stderr, errbuf); fflush(stderr); }
void xed_disas_test(xed_disas_info_t* di) { static int first = 1; #if !defined(XED_ILD_ONLY) && !defined(XED2_PERF_MEASURE) xed_uint64_t errors = 0; #endif unsigned int m; unsigned char* z; unsigned char* zlimit; unsigned int length; int skipping; int last_all_zeros; unsigned int i; int okay; xed_decoded_inst_t xedd; xed_uint64_t runtime_instruction_address; xed_dot_graph_supp_t* gs = 0; xed_bool_t graph_empty = 1; //#define XED_USE_DECODE_CACHE #if defined(XED_USE_DECODE_CACHE) xed_decode_cache_t cache; xed_uint32_t n_cache_entries = 16 * 1024; xed_decode_cache_entry_t* cache_entries = (xed_decode_cache_entry_t*) malloc(n_cache_entries * sizeof(xed_decode_cache_entry_t)); xed_decode_cache_initialize(&cache, cache_entries, n_cache_entries); #endif if(di->dot_graph_output) { xed_syntax_enum_t syntax = XED_SYNTAX_INTEL; gs = xed_dot_graph_supp_create(syntax); } if(first) { xed_decode_stats_zero(&xed_stats, di); first = 0; } m = di->ninst; // number of things to decode z = di->a; if(di->runtime_vaddr_disas_start) if(di->runtime_vaddr_disas_start > di->runtime_vaddr) z = (di->runtime_vaddr_disas_start - di->runtime_vaddr) + di->a; zlimit = 0; if(di->runtime_vaddr_disas_end) { if(di->runtime_vaddr_disas_end > di->runtime_vaddr) zlimit = (di->runtime_vaddr_disas_end - di->runtime_vaddr) + di->a; else /* end address is before start of this region -- skip it */ goto finish; } if(z >= di->q) /* start pointer is after end of section */ goto finish; // for skipping long strings of zeros skipping = 0; last_all_zeros = 0; for(i = 0; i < m; i++) { int ilim, elim; if(zlimit && z >= zlimit) { if(di->xml_format == 0) printf("# end of range.\n"); break; } if(z >= di->q) { if(di->xml_format == 0) #if !defined(XED_ILD_ONLY) printf("# end of text section.\n"); #endif break; } /* if we get near the end of the section, clip the itext length */ ilim = 15; elim = di->q - z; if(elim < ilim) ilim = elim; if(CLIENT_VERBOSE3) { printf("\n==============================================\n"); printf("Decoding instruction " XED_FMT_U "\n", i); printf("==============================================\n"); } // if we get two full things of 0's in a row, start skipping. if(all_zeros((xed_uint8_t*) z, ilim)) { if(skipping) { z = z + ilim; continue; } else if(last_all_zeros) { #if !defined(XED_ILD_ONLY) && !defined(XED2_PERF_MEASURE) printf("...\n"); #endif z = z + ilim; skipping = 1; continue; } else last_all_zeros = 1; } else { skipping = 0; last_all_zeros = 0; } runtime_instruction_address = ((xed_uint64_t)(z - di->a)) + di->runtime_vaddr; if(CLIENT_VERBOSE3) { char tbuf[XED_HEX_BUFLEN]; printf("Runtime Address " XED_FMT_LX , runtime_instruction_address); xed_print_hex_line(tbuf, (xed_uint8_t*) z, ilim, XED_HEX_BUFLEN); printf(" [%s]\n", tbuf); } okay = 0; length = 0; xed_decoded_inst_zero_set_mode(&xedd, di->dstate); if(di->late_init) (*di->late_init)(&xedd); if(di->decode_only) { xed_uint64_t t1; xed_uint64_t t2; xed_error_enum_t xed_error = XED_ERROR_NONE; t1 = xed_get_time(); #if defined(XED_USE_DECODE_CACHE) xed_error = xed_decode_cache(&xedd, XED_REINTERPRET_CAST(const xed_uint8_t*, z), ilim, &cache); #else xed_error = decode_internal( &xedd, XED_REINTERPRET_CAST(const xed_uint8_t*, z), ilim); #endif t2 = xed_get_time(); okay = (xed_error == XED_ERROR_NONE); #if defined(PTI_XED_TEST) if(okay) pti_xed_test(&xedd, XED_REINTERPRET_CAST(const xed_uint8_t*, z), ilim, runtime_instruction_address); #endif xed_decode_stats_reset(&xed_stats, t1, t2); length = xed_decoded_inst_get_length(&xedd); if(okay && length == 0) { printf("Zero length on decoded instruction!\n"); xed_decode_error(runtime_instruction_address, z - di->a, z, xed_error); xedex_derror("Dieing"); } if(di->resync && di->symfn) { xed_bool_t resync = 0; unsigned int x; for(x = 1; x < length; x++) { char* name = (*di->symfn)(runtime_instruction_address + x, di->caller_symbol_data); if(name) { char buf[XED_HEX_BUFLEN]; /* bad news. We found a symbol in the middle of an * instruction. That probably means decoding is * messed up. This usually happens because of * data-in the code/text section. We should reject * the current instruction and pick up at the * symbol address. */ printf("ERROR: found symbol in the middle of" " an instruction. Resynchronizing...\n"); printf("ERROR: Rejecting: ["); xed_print_hex_line(buf, z, x, XED_HEX_BUFLEN); printf("%s]\n", buf); z += x; resync = 1; break; } } if(resync) continue; } xed_stats.total_ilen += length; //we don't want to print out disassembly with ILD perf #if !defined(XED_ILD_ONLY) && !defined(XED2_PERF_MEASURE) if(okay) { if(CLIENT_VERBOSE1) { char tbuf[XED_TMP_BUF_LEN]; xed_decoded_inst_dump(&xedd, tbuf, XED_TMP_BUF_LEN); printf("%s\n", tbuf); } if(CLIENT_VERBOSE) { char buffer[XED_TMP_BUF_LEN]; unsigned int dec_len; unsigned int sp; if(di->symfn) { char* name = (*di->symfn)(runtime_instruction_address, di->caller_symbol_data); if(name) { if(di->xml_format) printf("\n<SYM>%s</SYM>\n", name); else printf("\nSYM %s:\n", name); } } if(di->xml_format) { printf("<ASMLINE>\n"); printf(" <ADDR>" XED_FMT_LX "</ADDR>\n", runtime_instruction_address); printf(" <CATEGORY>%s</CATEGORY>\n", xed_category_enum_t2str( xed_decoded_inst_get_category(&xedd))); printf(" <EXTENSION>%s</EXTENSION>\n", xed_extension_enum_t2str( xed_decoded_inst_get_extension(&xedd))); printf(" <ITEXT>"); dec_len = xed_decoded_inst_get_length(&xedd); xed_print_hex_line(buffer, (xed_uint8_t*) z, dec_len, XED_TMP_BUF_LEN); printf("%s</ITEXT>\n", buffer); buffer[0] = 0; disassemble(buffer, XED_TMP_BUF_LEN, &xedd, runtime_instruction_address, di->caller_symbol_data); printf(" %s\n", buffer); printf("</ASMLINE>\n"); } else { printf("XDIS " XED_FMT_LX ": ", runtime_instruction_address); #if 0 /* test code for the new API */ if(xed_decoded_inst_masked_vector_operation(&xedd)) printf("MSK "); else printf(" "); #endif if(di->ast) { printf("%-6s ", xed_ast_input_enum_t2str( classify_avx_sse(&xedd))); } else { printf("%-9s ", xed_category_enum_t2str( xed_decoded_inst_get_category(&xedd))); printf("%-6s ", xed_extension_enum_t2str( xed_decoded_inst_get_extension(&xedd))); } dec_len = xed_decoded_inst_get_length(&xedd); xed_print_hex_line(buffer, (xed_uint8_t*) z, dec_len, XED_HEX_BUFLEN); printf("%s", buffer); // pad out the instruction bytes for(sp = dec_len; sp < 12; sp++) printf(" "); printf(" "); buffer[0] = 0; disassemble(buffer, XED_TMP_BUF_LEN, &xedd, runtime_instruction_address, di->caller_symbol_data); printf("%s", buffer); if(gs) { graph_empty = 0; xed_dot_graph_add_instruction( gs, &xedd, runtime_instruction_address, di->caller_symbol_data); } if(di->line_number_info_fn) (*di->line_number_info_fn)(runtime_instruction_address); printf("\n"); } } } else { errors++; xed_decode_error(runtime_instruction_address, z - di->a, z, xed_error); // just give a length of 1B to see if we can restart decode... length = 1; } } #if defined(XED_ENCODER) else {
xed_uint_t disas_decode_encode_binary(const xed_state_t* dstate, const xed_uint8_t* decode_text_binary, const unsigned int bytes, xed_decoded_inst_t* xedd, xed_uint64_t runtime_address) { // decode then encode unsigned int retval_olen = 0; // decode it... xed_bool_t decode_okay = disas_decode_binary(dstate, decode_text_binary, bytes, xedd, runtime_address); if(decode_okay) { xed_error_enum_t encode_okay; xed_uint64_t t1, t2; unsigned int enc_olen, ilen = XED_MAX_INSTRUCTION_BYTES; xed_uint8_t array[XED_MAX_INSTRUCTION_BYTES]; // they are basically the same now xed_encoder_request_t* enc_req = xedd; // convert decode structure to proper encode structure xed_encoder_request_init_from_decode(xedd); // encode it again... t1 = xed_get_time(); encode_okay = xed_encode(enc_req, array, ilen, &enc_olen); t2 = xed_get_time(); if(encode_okay != XED_ERROR_NONE) { if(CLIENT_VERBOSE) { char buf[XED_TMP_BUF_LEN]; char buf2[XED_TMP_BUF_LEN]; int blen = XED_TMP_BUF_LEN; xed_encode_request_print(enc_req, buf, XED_TMP_BUF_LEN); blen = xed_strncpy(buf2, "Could not re-encode: ", blen); blen = xed_strncat(buf2, buf, blen); blen = xed_strncat(buf2, "\nError code was: ", blen); blen = xed_strncat(buf2, xed_error_enum_t2str(encode_okay), blen); blen = xed_strncat(buf2, "\n", blen); xedex_dwarn(buf2); } } else { retval_olen = enc_olen; // See if it matched the original... if(CLIENT_VERBOSE) { char buf[XED_HEX_BUFLEN]; xed_uint_t dec_length; xed_print_hex_line(buf, array, enc_olen, XED_HEX_BUFLEN); printf("Encodable! %s\n", buf); xed_decode_stats_reset(&xed_enc_stats, t1, t2); dec_length = xed_decoded_inst_get_length(xedd); if((enc_olen != dec_length || memcmp(decode_text_binary, array, enc_olen))) { char buf2[XED_TMP_BUF_LEN]; char buf3[XED_TMP_BUF_LEN]; printf("Discrepenacy after re-encoding. dec_len= " XED_FMT_U " ", dec_length); xed_print_hex_line(buf, decode_text_binary, dec_length, XED_HEX_BUFLEN); printf("[%s] ", buf); printf("enc_olen= " XED_FMT_U "", enc_olen); xed_print_hex_line(buf, array, enc_olen, XED_HEX_BUFLEN); printf(" [%s] ", buf); printf("for instruction: "); xed_decoded_inst_dump(xedd, buf3, XED_TMP_BUF_LEN); printf("%s\n", buf3); printf("vs Encode request: "); xed_encode_request_print(enc_req, buf2, XED_TMP_BUF_LEN); printf("%s\n", buf2); } else printf("Identical re-encoding\n"); } } } return retval_olen; }
int main(int argc, char** argv) { xed_error_enum_t xed_error; xed_bool_t long_mode = 0; unsigned 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_bool_t ok; unsigned int isyntax; xed_syntax_enum_t syntax; xed_machine_mode_enum_t mmode; xed_address_width_enum_t stack_addr_width; xed_format_options_t format_options; // one time initialization xed_tables_init(); xed_set_verbosity( 99 ); memset(&format_options,0, sizeof(format_options)); format_options.hex_address_before_symbolic_name=0; format_options.xml_a=0; format_options.omit_unit_scale=0; for(i=1;i<argc;i++) { if (strcmp(argv[i], "-xml") == 0) format_options.xml_a=1; else if (strcmp(argv[i], "-no-unit-scale") == 0) format_options.omit_unit_scale=1; else if (strcmp(argv[i], "-64") == 0) long_mode = 1; else break; } xed_format_set_options( format_options ); /// begin processing of instructions... if (long_mode) { mmode=XED_MACHINE_MODE_LONG_64; stack_addr_width =XED_ADDRESS_WIDTH_64b; } else { mmode=XED_MACHINE_MODE_LEGACY_32; stack_addr_width =XED_ADDRESS_WIDTH_32b; } xed_decoded_inst_zero(&xedd); xed_decoded_inst_set_mode(&xedd, mmode, stack_addr_width); for( ;i < argc; i++) { xed_uint8_t x = (xed_uint8_t)(xed_atoi_hex(argv[i])); assert(bytes < XED_MAX_INSTRUCTION_BYTES); itext[bytes++] = x; } if (bytes == 0) { fprintf(stderr, "Must supply some hex bytes\n"); exit(1); } printf("PARSING BYTES: "); for( u=0;u<bytes; u++) printf("%02x ", STATIC_CAST(unsigned int,itext[u])); printf("\n"); xed_error = xed_decode(&xedd, REINTERPRET_CAST(const xed_uint8_t*,itext), bytes); switch(xed_error) { case XED_ERROR_NONE: break; case XED_ERROR_BUFFER_TOO_SHORT: fprintf(stderr,"Not enough bytes provided\n"); exit(1); case XED_ERROR_GENERAL_ERROR: fprintf(stderr,"Could not decode given input.\n"); exit(1); default: fprintf(stderr,"Unhandled error code %s\n", xed_error_enum_t2str(xed_error)); exit(1); } xed_decoded_inst_dump(&xedd,buffer, BUFLEN); printf("%s\n",buffer); for(isyntax= XED_SYNTAX_XED; isyntax < XED_SYNTAX_LAST; isyntax++) { syntax = STATIC_CAST(xed_syntax_enum_t, isyntax); ok = xed_format(syntax, &xedd, buffer, BUFLEN, 0); if (ok) printf("%s syntax: %s\n", xed_syntax_enum_t2str(syntax), buffer); else printf("Error disassembling %s syntax\n", xed_syntax_enum_t2str(syntax)); } return 0; }
int main(int argc, char** argv) { xed_error_enum_t xed_error; xed_bool_t long_mode = 0; xed_bool_t prot16 = 0; unsigned int first_argv; unsigned 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_bool_t ok; unsigned int isyntax; xed_syntax_enum_t syntax; xed_machine_mode_enum_t mmode; xed_address_width_enum_t stack_addr_width; xed_encoder_request_t* enc_req; xed_uint8_t array[XED_MAX_INSTRUCTION_BYTES]; unsigned int enc_olen, ilen = XED_MAX_INSTRUCTION_BYTES; xed_error_enum_t encode_okay; xed_bool_t change_to_long_mode = 0; xed_tables_init(); xed_set_verbosity( 99 ); if (argc > 2 && strcmp(argv[1], "-64") == 0) long_mode = 1; else if (argc > 2 && strcmp(argv[1], "-16") == 0) prot16 = 1; if (long_mode) { first_argv = 2; mmode=XED_MACHINE_MODE_LONG_64; stack_addr_width =XED_ADDRESS_WIDTH_64b; } else if (prot16) { first_argv = 2; mmode=XED_MACHINE_MODE_LEGACY_16; stack_addr_width =XED_ADDRESS_WIDTH_16b; } else { first_argv=1; mmode=XED_MACHINE_MODE_LEGACY_32; stack_addr_width =XED_ADDRESS_WIDTH_32b; } xed_decoded_inst_zero(&xedd); xed_decoded_inst_set_mode(&xedd, mmode, stack_addr_width); for( i=first_argv ;i < argc; i++) { xed_uint8_t x = (xed_uint8_t)(xed_atoi_hex(argv[i])); assert(bytes < XED_MAX_INSTRUCTION_BYTES); itext[bytes++] = x; } if (bytes == 0) { fprintf(stderr, "Must supply some hex bytes\n"); exit(1); } printf("PARSING BYTES: "); for( u=0;u<bytes; u++) printf("%02x ", XED_STATIC_CAST(unsigned int,itext[u])); printf("\n"); xed_error = xed_decode(&xedd, XED_REINTERPRET_CAST(const xed_uint8_t*,itext), bytes); switch(xed_error) { case XED_ERROR_NONE: break; case XED_ERROR_BUFFER_TOO_SHORT: fprintf(stderr,"Not enough bytes provided\n"); exit(1); case XED_ERROR_GENERAL_ERROR: fprintf(stderr,"Could not decode given input.\n"); exit(1); default: fprintf(stderr,"Unhandled error code %s\n", xed_error_enum_t2str(xed_error)); exit(1); } //memset(buffer,0,BUFLEN); xed_decoded_inst_dump(&xedd,buffer, BUFLEN); printf("%s\n",buffer); for(isyntax= XED_SYNTAX_XED; isyntax < XED_SYNTAX_LAST; isyntax++) { syntax = XED_STATIC_CAST(xed_syntax_enum_t, isyntax); ok = xed_format_context(syntax, &xedd, buffer, BUFLEN, 0, 0, 0); if (ok) printf("%s syntax: %s\n", xed_syntax_enum_t2str(syntax), buffer); else printf("Error disassembling %s syntax\n", xed_syntax_enum_t2str(syntax)); } printf("\n\nPreparing to encode ...\n"); enc_req = &xedd; // they are basically the same now // convert decode structure to proper encode structure xed_encoder_request_init_from_decode(&xedd); change_to_long_mode = 0; if (change_to_long_mode) { // change to 64b mode xed_state_t state; xed_operand_values_t* ov; xed_state_init2(&state,XED_MACHINE_MODE_LONG_64,XED_ADDRESS_WIDTH_64b); ov = xed_decoded_inst_operands(&xedd); xed_operand_values_set_mode(ov, &state); xed_encoder_request_set_effective_address_size(enc_req, 64); // need to fix base regs... //xed_operand_values_set_operand_reg(ov, XED_OPERAND_BASE0, XED_REG_RSI); xed_encoder_request_set_effective_operand_width(enc_req, 32); } printf("Encoding...\n"); encode_okay = xed_encode(enc_req, array, ilen, &enc_olen); if (encode_okay != XED_ERROR_NONE) { printf("Error code = %s\n", xed_error_enum_t2str(encode_okay)); } else { unsigned int j; printf("Encodable: "); for(j=0;j<enc_olen;j++) { printf("%02x", array[j]); } printf("\n"); } return 0; }
int main(int argc, char** argv) { xed_error_enum_t xed_error; xed_bool_t long_mode = 0; xed_bool_t real_mode = 0; xed_bool_t protected_16 = 0; xed_state_t dstate; unsigned int first_argv; unsigned 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_bool_t ok; unsigned int isyntax; xed_syntax_enum_t syntax; unsigned int memop_index = 0; unsigned int memops = 0; xed_uint64_t out_addr = 0; xed_tables_init(); xed_agen_register_callback( register_callback, segment_callback); xed_state_zero(&dstate); xed_set_verbosity( 99 ); if (argc > 2 && strcmp(argv[1], "-64") == 0) long_mode = 1; if (argc > 2 && strcmp(argv[1], "-r") == 0) real_mode = 1; if (argc > 2 && strcmp(argv[1], "-16") == 0) protected_16 = 1; if (long_mode) { first_argv = 2; dstate.mmode=XED_MACHINE_MODE_LONG_64; } else if (protected_16) { first_argv = 2; xed_state_init(&dstate, XED_MACHINE_MODE_LEGACY_16, XED_ADDRESS_WIDTH_16b, XED_ADDRESS_WIDTH_16b); } else if (real_mode) { first_argv = 2; /* we say that real mode uses 16b addressing even though the addresses returned are 20b long. */ xed_state_init(&dstate, XED_MACHINE_MODE_REAL_16, XED_ADDRESS_WIDTH_16b, XED_ADDRESS_WIDTH_16b); } 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++) { xed_uint8_t x = (xed_uint8_t)(xed_atoi_hex(argv[i])); assert(bytes < XED_MAX_INSTRUCTION_BYTES); itext[bytes++] = x; } if (bytes == 0) { fprintf(stderr, "Must supply some hex bytes\n"); exit(1); } printf("PARSING BYTES: "); for( u=0; u<bytes; u++) printf("%02x ", STATIC_CAST(unsigned int,itext[u])); printf("\n"); xed_error = xed_decode(&xedd, REINTERPRET_CAST(const xed_uint8_t*,itext), bytes); switch(xed_error) { case XED_ERROR_NONE: break; case XED_ERROR_BUFFER_TOO_SHORT: fprintf(stderr,"Not enough bytes provided\n"); exit(1); case XED_ERROR_GENERAL_ERROR: fprintf(stderr,"Could not decode given input.\n"); exit(1); default: fprintf(stderr,"Unhandled error code %s\n", xed_error_enum_t2str(xed_error)); exit(1); } xed_decoded_inst_dump(&xedd,buffer, BUFLEN); printf("%s\n",buffer); for(isyntax= XED_SYNTAX_XED; isyntax < XED_SYNTAX_LAST; isyntax++) { syntax = STATIC_CAST(xed_syntax_enum_t, isyntax); ok = xed_format(syntax, &xedd, buffer, BUFLEN, 0); if (ok) printf("%s syntax: %s\n", xed_syntax_enum_t2str(syntax), buffer); else printf("Error disassembling %s syntax\n", xed_syntax_enum_t2str(syntax)); } memops = xed_decoded_inst_number_of_memory_operands(&xedd); printf("\nNumber of memory operands: %d\n", (int)memops); for(memop_index=0; memop_index<memops; memop_index++) { xed_error = xed_agen(&xedd, memop_index, 0, &out_addr); if (xed_error != XED_ERROR_NONE) { fprintf(stderr,"Agen error code %s\n", xed_error_enum_t2str(xed_error)); exit(1); } printf("\tMemory agen%d: " XED_FMT_LX "\n", (int)memop_index, out_addr); } return 0; }
int main(int argc, char** argv) { xed_error_enum_t xed_error; xed_bool_t long_mode = 0; xed_state_t dstate; unsigned int first_argv; unsigned 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_bool_t ok; unsigned int isyntax; xed_syntax_enum_t syntax; xed_tables_init(); xed_state_zero(&dstate); xed_set_verbosity( 99 ); if (argc > 2 && strcmp(argv[1], "-64") == 0) long_mode = 1; 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++) { xed_uint8_t x = (xed_uint8_t)(xed_atoi_hex(argv[i])); assert(bytes < XED_MAX_INSTRUCTION_BYTES); itext[bytes++] = x; } if (bytes == 0) { fprintf(stderr, "Must supply some hex bytes\n"); exit(1); } printf("PARSING BYTES: "); for( u=0;u<bytes; u++) printf("%02x ", STATIC_CAST(unsigned int,itext[u])); printf("\n"); xed_error = xed_decode(&xedd, REINTERPRET_CAST(const xed_uint8_t*,itext), bytes); switch(xed_error) { case XED_ERROR_NONE: break; case XED_ERROR_BUFFER_TOO_SHORT: fprintf(stderr,"Not enough bytes provided\n"); exit(1); case XED_ERROR_GENERAL_ERROR: fprintf(stderr,"Could not decode given input.\n"); exit(1); default: fprintf(stderr,"Unhandled error code %s\n", xed_error_enum_t2str(xed_error)); exit(1); } //memset(buffer,0,BUFLEN); xed_decoded_inst_dump(&xedd,buffer, BUFLEN); printf("%s\n",buffer); for(isyntax= XED_SYNTAX_XED; isyntax < XED_SYNTAX_LAST; isyntax++) { syntax = STATIC_CAST(xed_syntax_enum_t, isyntax); ok = xed_format(syntax, &xedd, buffer, BUFLEN, 0); if (ok) printf("%s syntax: %s\n", xed_syntax_enum_t2str(syntax), buffer); else printf("Error disassembling %s syntax\n", xed_syntax_enum_t2str(syntax)); } return 0; }