blob: ef88ccb9376d1ca39daa67f88cfa9c679d2137c3 [file] [log] [blame]
YUHANG TANGa7b48522016-10-19 22:28:05 +08001/* Tang Yuhang <tyh000011112222@gmail.com> 2016 */
echotyh51c8c502016-10-10 15:16:56 +08002#include <string.h>
3#include <ctype.h>
4#include <errno.h>
5
Nguyen Anh Quynh56649982016-10-11 00:04:46 +08006#include <capstone/capstone.h>
echotyh51c8c502016-10-10 15:16:56 +08007
YUHANG TANG9354e5e2016-10-14 17:29:56 +08008void print_insn_detail_x86(csh ud, cs_mode mode, cs_insn *ins);
YUHANG TANG08da0c02016-10-14 20:47:29 +08009void print_insn_detail_arm(csh handle, cs_insn *ins);
10void print_insn_detail_arm64(csh handle, cs_insn *ins);
11void print_insn_detail_mips(csh handle, cs_insn *ins);
12void print_insn_detail_ppc(csh handle, cs_insn *ins);
13void print_insn_detail_sparc(csh handle, cs_insn *ins);
14void print_insn_detail_sysz(csh handle, cs_insn *ins);
15void print_insn_detail_xcore(csh handle, cs_insn *ins);
YUHANG TANG9bc14c12016-10-28 15:32:50 +080016void print_insn_detail_m68k(csh handle, cs_insn *ins);
Fotis Loukos44ca0e32017-04-17 11:58:29 +030017void print_insn_detail_tms320c64x(csh handle, cs_insn *ins);
YUHANG TANG9354e5e2016-10-14 17:29:56 +080018
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +080019void print_string_hex(char *comment, unsigned char *str, size_t len)
20{
21 unsigned char *c;
22
23 printf("%s", comment);
24 for (c = str; c < str + len; c++) {
25 printf("0x%02x ", *c & 0xff);
26 }
27
28 printf("\n");
29}
30
echotyh51c8c502016-10-10 15:16:56 +080031// convert hexchar to hexnum
32static uint8_t char_to_hexnum(char c)
33{
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080034 if (c >= '0' && c <= '9') {
YUHANG TANGbde12ae2016-10-21 16:03:35 +080035 return (uint8_t)(c - '0');
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080036 }
37
38 if (c >= 'a' && c <= 'f') {
39 return (uint8_t)(10 + c - 'a');
40 }
41
42 // c >= 'A' && c <= 'F'
43 return (uint8_t)(10 + c - 'A');
echotyh51c8c502016-10-10 15:16:56 +080044}
45
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080046// convert user input (char[]) to uint8_t[], each element of which is
47// valid hexadecimal, and return actual length of uint8_t[] in @size.
echotyh51c8c502016-10-10 15:16:56 +080048static uint8_t *preprocess(char *code, size_t *size)
49{
YUHANG TANGbde12ae2016-10-21 16:03:35 +080050 size_t i = 0, j = 0;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080051 uint8_t high, low;
52 uint8_t *result;
echotyh51c8c502016-10-10 15:16:56 +080053
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080054 result = (uint8_t *)malloc(strlen(code));
55 if (result != NULL) {
56 while (code[i] != '\0') {
57 if (isxdigit(code[i]) && isxdigit(code[i+1])) {
58 high = 16 * char_to_hexnum(code[i]);
59 low = char_to_hexnum(code[i+1]);
60 result[j] = high + low;
61 i++;
62 j++;
63 }
64 i++;
65 }
66 *size = j;
67 }
68
69 return result;
echotyh51c8c502016-10-10 15:16:56 +080070}
71
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080072static void usage(char *prog)
echotyh51c8c502016-10-10 15:16:56 +080073{
Nguyen Anh Quynh7532fc72016-11-04 23:57:52 +080074 printf("Cstool for Capstone Disassembler Engine v%u.%u.%u\n\n", CS_VERSION_MAJOR, CS_VERSION_MINOR, CS_VERSION_EXTRA);
Nguyen Anh Quynhe18496f2016-10-22 23:38:00 +080075 printf("Syntax: %s [-d] <arch+mode> <assembly-hexstring> [start-address-in-hex-format]\n", prog);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080076 printf("\nThe following <arch+mode> options are supported:\n");
77
78 if (cs_support(CS_ARCH_X86)) {
79 printf(" x16: 16-bit mode (X86)\n");
80 printf(" x32: 32-bit mode (X86)\n");
81 printf(" x64: 64-bit mode (X86)\n");
82 printf(" x16att: 16-bit mode (X86) syntax-att\n");
83 printf(" x32att: 32-bit mode (X86) syntax-att\n");
84 printf(" x64att: 64-bit mode (X86) syntax-att\n");
85 }
86
87 if (cs_support(CS_ARCH_ARM)) {
88 printf(" arm: arm\n");
Nguyen Anh Quynh996db1f2017-03-10 20:30:55 +080089 printf(" armbe: arm + big endian\n");
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080090 printf(" thumb: thumb mode\n");
91 printf(" thumbbe: thumb + big endian\n");
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080092 }
93
94 if (cs_support(CS_ARCH_ARM64)) {
95 printf(" arm64: aarch64 mode\n");
Nguyen Anh Quynh6d609eb2017-04-25 21:33:26 +080096 printf(" arm64be: aarch64 + big endian\n");
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +080097 }
98
99 if (cs_support(CS_ARCH_MIPS)) {
100 printf(" mips: mips32 + little endian\n");
101 printf(" mipsbe: mips32 + big endian\n");
102 printf(" mips64: mips64 + little endian\n");
103 printf(" mips64be: mips64 + big endian\n");
104 }
105
106 if (cs_support(CS_ARCH_PPC)) {
107 printf(" ppc64: ppc64 + little endian\n");
108 printf(" ppc64be: ppc64 + big endian\n");
109 }
110
111 if (cs_support(CS_ARCH_SPARC)) {
112 printf(" sparc: sparc\n");
113 }
114
115 if (cs_support(CS_ARCH_SYSZ)) {
116 printf(" systemz: systemz (s390x)\n");
117 }
118
119 if (cs_support(CS_ARCH_XCORE)) {
120 printf(" xcore: xcore\n");
121 }
YUHANG TANGbe3f8672016-10-27 12:12:59 +0800122
123 if (cs_support(CS_ARCH_M68K)) {
Nguyen Anh Quynhdf6f9cc2016-10-28 16:12:05 +0800124 printf(" m68k: m68k + big endian\n");
YUHANG TANGbe3f8672016-10-27 12:12:59 +0800125 printf(" m68k40: m68k_040\n");
YUHANG TANGbe3f8672016-10-27 12:12:59 +0800126 }
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800127
Fotis Loukos44ca0e32017-04-17 11:58:29 +0300128 if (cs_support(CS_ARCH_TMS320C64X)) {
129 printf(" tms320c64x:TMS320C64x\n");
130 }
131
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800132 printf("\n");
echotyh51c8c502016-10-10 15:16:56 +0800133}
134
135int main(int argc, char **argv)
136{
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800137 csh handle;
138 char *mode;
139 uint8_t *assembly;
140 size_t count, size;
141 uint64_t address = 0;
142 cs_insn *insn;
143 cs_err err;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800144 cs_mode md;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800145 cs_arch arch;
146 bool detail_flag = false;
echotyh51c8c502016-10-10 15:16:56 +0800147
YUHANG TANG9354e5e2016-10-14 17:29:56 +0800148 if (argc != 3 && argc != 4 && argc != 5) {
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800149 usage(argv[0]);
150 return -1;
151 }
echotyh51c8c502016-10-10 15:16:56 +0800152
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800153 if (!strcmp(argv[1], "-d")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800154 if (argc == 3) {
155 usage(argv[0]);
156 return -1;
157 }
158 detail_flag = true;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800159 mode = argv[2];
160 assembly = preprocess(argv[3], &size);
161 if (argc == 5) {
162 char *temp;
163 address = strtoull(argv[4], &temp, 16);
164 if (temp == argv[4] || *temp != '\0' || errno == ERANGE) {
165 printf("ERROR: invalid address argument, quit!\n");
166 return -2;
167 }
168 }
169 } else {
170 if (argc == 5) {
171 usage(argv[0]);
172 return -1;
173 }
174
175 mode = argv[1];
176 assembly = preprocess(argv[2], &size);
177 if (assembly == NULL) {
178 printf("ERROR: invalid assembler-string argument, quit!\n");
179 return -3;
180 }
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800181
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800182 if (argc == 4) {
183 // cstool <arch> <assembly> <address>
184 char *temp;
185 address = strtoull(argv[3], &temp, 16);
186 if (temp == argv[3] || *temp != '\0' || errno == ERANGE) {
187 printf("ERROR: invalid address argument, quit!\n");
188 return -2;
189 }
190 }
191 }
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800192
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800193 if (!strcmp(mode, "arm")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800194 arch = CS_ARCH_ARM;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800195 err = cs_open(CS_ARCH_ARM, CS_MODE_ARM, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800196 }
197
Nguyen Anh Quynh996db1f2017-03-10 20:30:55 +0800198 if (!strcmp(mode, "armb") || !strcmp(mode, "armbe") ) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800199 arch = CS_ARCH_ARM;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800200 err = cs_open(CS_ARCH_ARM, CS_MODE_ARM | CS_MODE_BIG_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800201 }
202
203 if (!strcmp(mode, "arml")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800204 arch = CS_ARCH_ARM;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800205 err = cs_open(CS_ARCH_ARM, CS_MODE_ARM | CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800206 }
207
208 if (!strcmp(mode, "thumb")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800209 arch = CS_ARCH_ARM;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800210 err = cs_open(CS_ARCH_ARM, CS_MODE_THUMB | CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800211 }
212
213 if (!strcmp(mode, "thumbbe")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800214 arch = CS_ARCH_ARM;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800215 err = cs_open(CS_ARCH_ARM, CS_MODE_THUMB | CS_MODE_BIG_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800216 }
217
218 if (!strcmp(mode, "thumble")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800219 arch = CS_ARCH_ARM;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800220 err = cs_open(CS_ARCH_ARM, CS_MODE_ARM | CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800221 }
222
223 if (!strcmp(mode, "arm64")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800224 arch = CS_ARCH_ARM64;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800225 err = cs_open(CS_ARCH_ARM64, CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800226 }
227
Nguyen Anh Quynh6d609eb2017-04-25 21:33:26 +0800228 if (!strcmp(mode, "arm64be")) {
229 arch = CS_ARCH_ARM64;
230 err = cs_open(CS_ARCH_ARM64, CS_MODE_BIG_ENDIAN, &handle);
231 }
232
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800233 if (!strcmp(mode, "mips")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800234 arch = CS_ARCH_MIPS;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800235 err = cs_open(CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800236 }
237
238 if (!strcmp(mode, "mipsbe")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800239 arch = CS_ARCH_MIPS;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800240 err = cs_open(CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_BIG_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800241 }
242
243 if (!strcmp(mode, "mips64")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800244 arch = CS_ARCH_MIPS;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800245 err = cs_open(CS_ARCH_MIPS, CS_MODE_MIPS64 | CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800246 }
247
248 if (!strcmp(mode, "mips64be")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800249 arch = CS_ARCH_MIPS;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800250 err = cs_open(CS_ARCH_MIPS, CS_MODE_MIPS64 | CS_MODE_BIG_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800251 }
252
253 if (!strcmp(mode, "x16")) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800254 md = CS_MODE_16;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800255 arch = CS_ARCH_X86;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800256 err = cs_open(CS_ARCH_X86, CS_MODE_16, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800257 }
258
259 if (!strcmp(mode, "x32")) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800260 md = CS_MODE_32;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800261 arch = CS_ARCH_X86;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800262 err = cs_open(CS_ARCH_X86, CS_MODE_32, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800263 }
264
265 if (!strcmp(mode, "x64")) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800266 md = CS_MODE_64;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800267 arch = CS_ARCH_X86;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800268 err = cs_open(CS_ARCH_X86, CS_MODE_64, &handle);
269 }
270
271 if (!strcmp(mode, "x16att")) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800272 md = CS_MODE_16;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800273 arch = CS_ARCH_X86;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800274 err = cs_open(CS_ARCH_X86, CS_MODE_16, &handle);
275 if (!err) {
276 cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800277 }
278 }
279
280 if (!strcmp(mode,"x32att")) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800281 md = CS_MODE_32;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800282 arch = CS_ARCH_X86;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800283 err = cs_open(CS_ARCH_X86, CS_MODE_32, &handle);
284 if (!err) {
285 cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT);
286 }
287 }
288
289 if (!strcmp(mode,"x64att")) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800290 md = CS_MODE_64;
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800291 arch = CS_ARCH_X86;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800292 err = cs_open(CS_ARCH_X86, CS_MODE_64, &handle);
293 if (!err) {
294 cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT);
295 }
296 }
297
298 if (!strcmp(mode,"ppc64")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800299 arch = CS_ARCH_PPC;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800300 err = cs_open(CS_ARCH_PPC, CS_MODE_64 | CS_MODE_LITTLE_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800301 }
302
303 if (!strcmp(mode,"ppc64be")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800304 arch = CS_ARCH_PPC;
Nguyen Anh Quynh13271a92017-04-11 09:45:55 +0800305 err = cs_open(CS_ARCH_PPC,CS_MODE_64 | CS_MODE_BIG_ENDIAN, &handle);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800306 }
307
308 if (!strcmp(mode,"sparc")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800309 arch = CS_ARCH_SPARC;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800310 err = cs_open(CS_ARCH_SPARC, CS_MODE_BIG_ENDIAN, &handle);
311 }
312
313 if (!strcmp(mode, "systemz") || !strcmp(mode, "sysz") || !strcmp(mode, "s390x")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800314 arch = CS_ARCH_SYSZ;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800315 err = cs_open(CS_ARCH_SYSZ, CS_MODE_BIG_ENDIAN, &handle);
316 }
317
318 if (!strcmp(mode,"xcore")) {
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800319 arch = CS_ARCH_XCORE;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800320 err = cs_open(CS_ARCH_XCORE, CS_MODE_BIG_ENDIAN, &handle);
321 }
YUHANG TANGbe3f8672016-10-27 12:12:59 +0800322
Nguyen Anh Quynhdf6f9cc2016-10-28 16:12:05 +0800323 if (!strcmp(mode,"m68k")) {
YUHANG TANGbe3f8672016-10-27 12:12:59 +0800324 arch = CS_ARCH_M68K;
325 err = cs_open(CS_ARCH_M68K, CS_MODE_BIG_ENDIAN, &handle);
326 }
327
328 if (!strcmp(mode,"m68k40")) {
329 arch = CS_ARCH_M68K;
330 err = cs_open(CS_ARCH_M68K, CS_MODE_M68K_040, &handle);
331 }
332
Fotis Loukos44ca0e32017-04-17 11:58:29 +0300333 if (!strcmp(mode,"tms320c64x")) {
334 arch = CS_ARCH_TMS320C64X;
335 err = cs_open(CS_ARCH_TMS320C64X, CS_MODE_BIG_ENDIAN, &handle);
336 }
337
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800338
339 if (err) {
340 printf("ERROR: Failed on cs_open(), quit!\n");
341 usage(argv[0]);
342 return -1;
343 }
344
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800345 if (detail_flag) {
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800346 cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
347 }
YUHANG TANG9354e5e2016-10-14 17:29:56 +0800348
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800349 count = cs_disasm(handle, assembly, size, address, 0, &insn);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800350 if (count > 0) {
Nguyen Anh Quynhbab2a932016-10-11 16:19:27 +0800351 size_t i;
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800352
Nguyen Anh Quynhbab2a932016-10-11 16:19:27 +0800353 for (i = 0; i < count; i++) {
354 int j;
355 printf("%"PRIx64" ", insn[i].address);
356 for (j = 0; j < insn[i].size; j++) {
357 printf("%02x", insn[i].bytes[j]);
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800358 }
Nguyen Anh Quynhbab2a932016-10-11 16:19:27 +0800359 // X86 instruction size is variable.
360 // align assembly instruction after the opcode
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800361 if (arch == CS_ARCH_X86) {
362
Nguyen Anh Quynhbab2a932016-10-11 16:19:27 +0800363 for (; j < 16; j++) {
364 printf(" ");
365 }
366 }
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800367
Nguyen Anh Quynhbab2a932016-10-11 16:19:27 +0800368 printf(" %s\t%s\n", insn[i].mnemonic, insn[i].op_str);
Nguyen Anh Quynh32238dc2016-10-21 16:42:47 +0800369
370 if (detail_flag) {
Nguyen Anh Quynh570db5f2016-11-05 00:43:22 +0800371 switch(arch) {
372 default: break;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800373
Nguyen Anh Quynh570db5f2016-11-05 00:43:22 +0800374 case CS_ARCH_X86:
375 print_insn_detail_x86(handle, md, &insn[i]);
376 break;
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800377
Nguyen Anh Quynh570db5f2016-11-05 00:43:22 +0800378 case CS_ARCH_ARM:
379 print_insn_detail_arm(handle, &insn[i]);
380 break;
381 case CS_ARCH_ARM64:
382 print_insn_detail_arm64(handle,&insn[i]);
383 break;
384 case CS_ARCH_MIPS:
385 print_insn_detail_mips(handle, &insn[i]);
386 break;
387 case CS_ARCH_PPC:
388 print_insn_detail_ppc(handle, &insn[i]);
389 break;
390 case CS_ARCH_SPARC:
391 print_insn_detail_sparc(handle, &insn[i]);
392 break;
393 case CS_ARCH_SYSZ:
394 print_insn_detail_sysz(handle, &insn[i]);
395 break;
396 case CS_ARCH_XCORE:
397 print_insn_detail_xcore(handle, &insn[i]);
398 break;
399 case CS_ARCH_M68K:
400 print_insn_detail_m68k(handle, &insn[i]);
401 break;
Fotis Loukos44ca0e32017-04-17 11:58:29 +0300402 case CS_ARCH_TMS320C64X:
403 print_insn_detail_tms320c64x(handle, &insn[i]);
404 break;
YUHANG TANGbe3f8672016-10-27 12:12:59 +0800405 }
Nguyen Anh Quynhfc0d6fb2016-11-05 00:47:14 +0800406
407 if (insn[i].detail->groups_count) {
408 int j;
409
410 printf("\tGroups: ");
411 for(j = 0; j < insn[i].detail->groups_count; j++) {
412 printf("%s ", cs_group_name(handle, insn[i].detail->groups[j]));
413 }
414 printf("\n");
415 }
416
417 printf("\n");
YUHANG TANGbde12ae2016-10-21 16:03:35 +0800418 }
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800419 }
Nguyen Anh Quynh570db5f2016-11-05 00:43:22 +0800420
Nguyen Anh Quynh815b94a2016-10-10 23:20:29 +0800421 cs_free(insn, count);
422 } else {
423 printf("ERROR: invalid assembly code\n");
424 return(-4);
425 }
426
427 cs_close(&handle);
428
429 return 0;
echotyh51c8c502016-10-10 15:16:56 +0800430}