Home | History | Annotate | Download | only in libdisasm

Lines Matching refs:len

18 #define STRNCAT( buf, str, len ) do {   				\
19 int _i = strlen(str), _blen = strlen(buf), _len = len - 1; \
20 if ( len ) { \
24 len = 0; \
26 len -= _i; \
31 #define STRNCATF( buf, fmt, data, len ) do { \
35 STRNCAT( buf, _tmp, len ); \
42 STRNCATF( buf, "-0x%" PRIX32, -ea->disp, len ); \
44 STRNCATF( buf, "0x%" PRIX32, ea->disp, len ); \
58 int len ) {
60 int len_orig = len;
63 if ( prefix & 1 ) { STRNCAT( buf, prefix_strings[1], len ); }
64 if ( prefix & 2 ) { STRNCAT( buf, prefix_strings[2], len ); }
65 if ( prefix & 4 ) { STRNCAT( buf, prefix_strings[3], len ); }
66 if ( prefix & 8 ) { STRNCAT( buf, prefix_strings[4], len ); }
69 return (len_orig - len);
75 static void get_operand_data_str( x86_op_t *op, char *str, int len ){
80 snprintf( str, len, "%" PRId8, op->data.sbyte );
83 snprintf( str, len, "%" PRId16, op->data.sword );
86 snprintf( str, len, "%" PRId64, op->data.sqword );
89 snprintf( str, len, "%" PRId32, op->data.sdword );
97 snprintf( str, len, "0x%02" PRIX8, op->data.byte );
100 snprintf( str, len, "0x%04" PRIX16, op->data.word );
103 snprintf( str, len, "0x%08" PRIX64,op->data.sqword );
106 snprintf( str, len, "0x%08" PRIX32, op->data.dword );
115 static void get_operand_regtype_str( int regtype, char *str, int len )
144 memset( str, 0, len );
154 STRNCAT( str, " ", len );
157 STRNCAT(str, operand_regtypes[i].name, len );
161 static int format_expr( x86_ea_t *ea, char *buf, int len,
168 STRNCAT( buf, "(", len );
171 STRNCATF( buf, "%%%s", ea->base.name, len );
174 STRNCATF( buf, ",%%%s", ea->index.name, len );
176 STRNCATF( buf, ",%d", ea->scale, len );
182 STRNCATF( buf, ",%d", ea->scale, len );
185 STRNCAT( buf, ")", len );
187 STRNCATF( buf, "0x%" PRIX32, ea->disp, len );
192 STRNCAT (buf, "\t\t\t<base>\n", len);
196 STRNCAT (buf, "\t\t\t\t<register ", len);
197 STRNCATF (buf, "name=\"%s\" ", ea->base.name, len);
198 STRNCATF (buf, "type=\"%s\" ", str, len);
199 STRNCATF (buf, "size=%d/>\n", ea->base.size, len);
201 STRNCAT (buf, "\t\t\t</base>\n", len);
205 STRNCAT (buf, "\t\t\t<index>\n", len);
210 STRNCAT (buf, "\t\t\t\t<register ", len);
211 STRNCATF (buf, "name=\"%s\" ", ea->index.name, len);
212 STRNCATF (buf, "type=\"%s\" ", str, len);
213 STRNCATF (buf, "size=%d/>\n", ea->index.size, len);
215 STRNCAT (buf, "\t\t\t</index>\n", len);
219 STRNCAT (buf, "\t\t\t<scale>\n", len);
220 STRNCAT (buf, "\t\t\t\t<immediate ", len);
221 STRNCATF (buf, "value=\"%d\"/>\n", ea->scale, len);
222 STRNCAT (buf, "\t\t\t</scale>\n", len);
226 STRNCAT (buf, "\t\t\t<displacement>\n", len);
229 STRNCAT (buf, "\t\t\t\t<address ", len);
231 len);
233 STRNCAT (buf, "\t\t\t\t<immediate ", len);
234 STRNCATF (buf, "value=%" PRId32 "/>\n", ea->disp, len);
237 STRNCAT (buf, "\t\t\t</displacement>\n", len);
243 STRNCAT( buf, "(", len );
245 STRNCATF( buf, "%s,", ea->base.name, len );
246 STRNCATF( buf, "%s,", ea->index.name, len );
247 STRNCATF( buf, "%d", ea->scale, len );
248 STRNCAT( buf, ")", len );
252 STRNCAT( buf, "[", len );
255 STRNCAT( buf, ea->base.name, len );
258 STRNCAT( buf, "+", len );
262 STRNCAT( buf, ea->index.name, len );
265 STRNCATF( buf, "*%" PRId32, ea->scale, len );
269 STRNCAT( buf, "+", len );
279 STRNCAT( buf, "]", len );
285 static int format_seg( x86_op_t *op, char *buf, int len,
287 int len_orig = len;
290 if (! op || ! buf || ! len || ! op->flags) {
317 STRNCAT( buf, "\t\t\t<segment ", len );
318 STRNCATF( buf, "value=\"%s\"/>\n", reg, len );
321 STRNCATF( buf, "%%%s:", reg, len );
325 STRNCATF( buf, "%s:", reg, len );
329 return( len_orig - len ); /* return length of appended string */
406 int len) {
432 int len_orig = len;
438 STRNCAT( buf, insn_flags[i].name, len );
441 return( len_orig - len );
646 int len){
654 STRNCATF( buf, "%%%s", op->data.reg.name, len );
659 STRNCATF( buf, "$%s", str, len );
665 insn->addr + insn->size), len );
672 insn->addr + insn->size), len );
676 insn->addr + insn->size), len );
683 len );
686 op->data.absolute.offset.off16, len );
689 op->data.absolute.offset.off32, len );
695 STRNCAT( buf, "*", len );
697 len -= format_seg( op, buf, len, att_syntax );
698 STRNCATF( buf, "0x%08" PRIX32, op->data.sdword, len );
704 STRNCAT( buf, "*", len );
706 len -= format_seg( op, buf, len, att_syntax );
707 len -= format_expr( &op->data.expression, buf, len,
720 int len){
726 STRNCAT( buf, op->data.reg.name, len );
731 STRNCAT( buf, str, len );
737 insn->addr + insn->size), len );
744 insn->addr + insn->size), len );
748 insn->addr + insn->size, len );
754 len );
757 op->data.absolute.offset.off16, len );
760 op->data.absolute.offset.off32, len );
765 len -= format_seg( op, buf, len, native_syntax );
766 STRNCATF( buf, "[0x%08" PRIX32 "]", op->data.sdword, len );
770 len -= format_seg( op, buf, len, native_syntax );
771 len -= format_expr( &op->data.expression, buf, len,
784 int len){
794 STRNCAT( buf, "\t\t<register ", len );
795 STRNCATF( buf, "name=\"%s\" ", op->data.reg.name, len );
796 STRNCATF( buf, "type=\"%s\" ", str, len );
797 STRNCATF( buf, "size=%d/>\n", op->data.reg.size, len );
804 STRNCAT( buf, "\t\t<immediate ", len );
806 get_operand_datatype_str (op), len );
807 STRNCATF( buf, "value=\"%s\"/>\n", str, len );
811 STRNCAT( buf, "\t\t<relative_offset ", len );
815 insn->addr + insn->size), len );
819 STRNCAT( buf, "\t\t<relative_offset ", len );
824 insn->addr + insn->size), len);
830 len );
838 op->data.absolute.segment, len );
842 op->data.absolute.offset.off16, len );
845 op->data.absolute.offset.off32, len );
848 STRNCAT( buf, "\t\t</absolute_address>\n", len );
854 STRNCAT( buf, "\t\t<address_expression>\n", len );
856 len -= format_seg( op, buf, len, xml_syntax );
857 len -= format_expr( &op->data.expression, buf, len,
860 STRNCAT( buf, "\t\t</address_expression>\n", len );
865 STRNCAT( buf, "\t\t<segment_offset>\n", len );
867 len -= format_seg( op, buf, len, xml_syntax );
869 STRNCAT( buf, "\t\t\t<address ", len);
871 op->data.sdword, len );
872 STRNCAT( buf, "\t\t</segment_offset>\n", len );
885 int len){
896 STRNCAT( buf, "reg|", len );
897 STRNCATF( buf, "%s|", datatype, len );
898 STRNCATF( buf, "%s:", op->data.reg.name, len );
899 STRNCATF( buf, "%s:", str, len );
900 STRNCATF( buf, "%d|", op->data.reg.size, len );
907 STRNCAT( buf, "immediate|", len );
908 STRNCATF( buf, "%s|", datatype, len );
909 STRNCATF( buf, "%s|", str, len );
917 STRNCAT( buf, "relative|", len );
918 STRNCATF( buf, "%s|", datatype, len );
919 STRNCATF( buf, "%" PRId8 "|", op->data.sbyte, len );
924 len );
925 STRNCATF( buf, "%s|", datatype, len );
928 STRNCATF( buf, "%" PRId16 "|", op->data.sword, len);
931 STRNCATF( buf, "%" PRId32 "|", op->data.sdword, len );
937 STRNCAT( buf, "absolute_address|", len );
938 STRNCATF( buf, "%s|", datatype, len );
941 len );
944 op->data.absolute.offset.off16, len );
947 op->data.absolute.offset.off32, len );
954 STRNCAT( buf, "address_expression|", len );
955 STRNCATF( buf, "%s|", datatype, len );
957 len -= format_seg( op, buf, len, native_syntax );
958 len -= format_expr( &op->data.expression, buf, len,
961 STRNCAT( buf, "|", len );
966 STRNCAT( buf, "segment_offset|", len );
967 STRNCATF( buf, "%s|", datatype, len );
969 len -= format_seg( op, buf, len, xml_syntax );
971 STRNCATF( buf, "%08" PRIX32 "|", op->data.sdword, len );
983 int x86_format_operand( x86_op_t *op, char *buf, int len,
987 if ( ! op || ! buf || len < 1 ) {
994 memset( buf, 0, len );
998 return format_operand_att( op, insn, buf, len );
1000 return format_operand_xml( op, insn, buf, len );
1002 return format_operand_raw( op, insn, buf, len );
1006 return format_operand_native( op, insn, buf, len );
1017 static int format_att_mnemonic( x86_insn_t *insn, char *buf, int len) {
1021 if (! insn || ! buf || ! len )
1024 memset( buf, 0, len );
1031 STRNCAT( buf, "l", len );
1033 STRNCAT( buf, insn->mnemonic, len );
1039 STRNCAT( buf, insn->mnemonic, len );
1067 STRNCAT( buf, suffix, len );
1071 int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len,
1075 memset( buf, 0, len );
1076 STRNCAT( buf, insn->prefix_string, len );
1079 STRNCAT( buf, str, len );
1081 STRNCAT( buf, insn->mnemonic, len );
1087 struct op_string { char *buf; size_t len; };
1092 format_operand_raw(op, insn, opstr->buf, opstr->len);
1095 static int format_insn_note(x86_insn_t *insn, char *buf, int len){
1097 int len_orig = len, note_len = 32;
1108 STRNCATF( buf, "%s|", note, len );
1110 return( len_orig - len );
1113 static int format_raw_insn( x86_insn_t *insn, char *buf, int len ){
1114 struct op_string opstr = { buf, len };
1130 STRNCATF( buf, "0x%08" PRIX32 "|", insn->addr , len );
1131 STRNCATF( buf, "0x%08" PRIX32 "|", insn->offset, len );
1132 STRNCATF( buf, "%d|" , insn->size , len );
1136 STRNCATF( buf, "%02X ", insn->bytes[i], len );
1138 STRNCAT( buf, "|", len );
1140 len -= format_insn_prefix_str( insn->prefix, buf, len );
1141 STRNCATF( buf, "|%s|", insn->prefix_string , len );
1142 STRNCATF( buf, "%s|", get_insn_group_str( insn->group ), len );
1143 STRNCATF( buf, "%s|", get_insn_type_str( insn->type ) , len );
1144 STRNCATF( buf, "%s|", insn->mnemonic , len );
1145 STRNCATF( buf, "%s|", get_insn_cpu_str( insn->cpu ) , len );
1146 STRNCATF( buf, "%s|", get_insn_isa_str( insn->isa ) , len );
1149 len -= format_insn_note( insn, buf, len );
1151 len -= format_insn_eflags_str( insn->flags_set, buf, len );
1152 STRNCAT( buf, "|", len );
1153 len -= format_insn_eflags_str( insn->flags_tested, buf, len );
1154 STRNCAT( buf, "|", len );
1155 STRNCATF( buf, "%d|", insn->stack_mod, len );
1156 STRNCATF( buf, "%" PRId32 "|", insn->stack_mod_val, len );
1158 opstr.len = len;
1164 static int format_xml_insn( x86_insn_t *insn, char *buf, int len ) {
1168 STRNCAT( buf, "<x86_insn>\n", len );
1170 STRNCATF( buf, "\t<address rva=\"0x%08" PRIX32 "\" ", insn->addr, len );
1171 STRNCATF( buf, "offset=\"0x%08" PRIX32 "\" ", insn->offset, len );
1172 STRNCATF( buf, "size=%d bytes=\"", insn->size, len );
1175 STRNCATF( buf, "%02X ", insn->bytes[i], len );
1177 STRNCAT( buf, "\"/>\n", len );
1179 STRNCAT( buf, "\t<prefix type=\"", len );
1180 len -= format_insn_prefix_str( insn->prefix, buf, len );
1181 STRNCATF( buf, "\" string=\"%s\"/>\n", insn->prefix_string, len );
1184 get_insn_group_str (insn->group), len );
1185 STRNCATF( buf, "type=\"%s\" ", get_insn_type_str (insn->type), len );
1186 STRNCATF( buf, "string=\"%s\"/>\n", insn->mnemonic, len );
1188 STRNCAT( buf, "\t<flags type=set>\n", len );
1189 STRNCAT( buf, "\t\t<flag name=\"", len );
1190 len -= format_insn_eflags_str( insn->flags_set, buf, len );
1191 STRNCAT( buf, "\"/>\n\t</flags>\n", len );
1194 STRNCAT( buf, "\t<flags type=tested>\n", len );
1195 STRNCAT( buf, "\t\t<flag name=\"", len );
1196 len -= format_insn_eflags_str( insn->flags_tested, buf, len );
1197 STRNCAT( buf, "\"/>\n\t</flags>\n", len );
1202 STRNCAT( buf, "\t<operand name=dest>\n", len );
1203 STRNCAT( buf, str, len );
1204 STRNCAT( buf, "\t</operand>\n", len );
1210 STRNCAT( buf, "\t<operand name=src>\n", len );
1211 STRNCAT( buf, str, len );
1212 STRNCAT( buf, "\t</operand>\n", len );
1218 STRNCAT( buf, "\t<operand name=imm>\n", len );
1219 STRNCAT( buf, str, len );
1220 STRNCAT( buf, "\t</operand>\n", len );
1223 STRNCAT( buf, "</x86_insn>\n", len );
1228 int x86_format_header( char *buf, int len, enum x86_asm_format format ) {
1231 snprintf( buf, len, "MNEMONIC\tSRC, DEST, IMM" );
1234 snprintf( buf, len, "MNEMONIC\tDEST, SRC, IMM" );
1237 snprintf( buf, len, "ADDRESS\tBYTES\tMNEMONIC\t"
1241 snprintf( buf, len, "ADDRESS|OFFSET|SIZE|BYTES|"
1249 snprintf( buf, len,
1293 if ( len ) {
1302 int x86_format_insn( x86_insn_t *insn, char *buf, int len,
1308 memset(buf, 0, len);
1311 STRNCAT( buf, insn->prefix_string, len );
1312 STRNCAT( buf, insn->mnemonic, len );
1313 STRNCAT( buf, "\t", len );
1318 STRNCAT( buf, str, len );
1324 STRNCAT( buf, ", ", len );
1327 STRNCAT( buf, str, len );
1332 STRNCAT( buf, ", ", len );
1335 STRNCAT( buf, str, len );
1340 STRNCAT( buf, insn->prefix_string, len );
1342 STRNCATF( buf, "%s\t", str, len);
1351 STRNCAT( buf, str, len );
1353 STRNCAT( buf, ", ", len );
1370 STRNCAT( buf, str, len );
1373 STRNCAT( buf, ", ", len );
1380 STRNCAT( buf, str, len );
1385 format_raw_insn( insn, buf, len );
1387 format_xml_insn( insn, buf, len );
1391 STRNCATF( buf, "%08" PRIX32 "\t", insn->addr, len );
1395 STRNCATF( buf, "%02X ", insn->bytes[i], len );
1398 STRNCAT( buf, "\t", len );
1401 STRNCAT( buf, insn->prefix_string, len );
1402 STRNCAT( buf, insn->mnemonic, len );
1403 STRNCAT( buf, "\t", len );
1410 STRNCATF( buf, "%s\t", str, len );
1417 STRNCATF( buf, "%s\t", str, len );
1424 STRNCAT( buf, str, len );