Mercurial > projects > ddbg_continued
comparison udis86-1.4/libudis86/syn-att.c @ 1:4a9dcbd9e54f
-files of 0.13 beta
-fixes so that it now compiles with the current dmd version
author | marton@basel.hu |
---|---|
date | Tue, 05 Apr 2011 20:44:01 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:586e4a649642 | 1:4a9dcbd9e54f |
---|---|
1 /* ----------------------------------------------------------------------------- | |
2 * syn-att.c | |
3 * | |
4 * Copyright (c) 2004, 2005, 2006 Vivek Mohan <vivek@sig9.com> | |
5 * All rights reserved. See (LICENSE) | |
6 * ----------------------------------------------------------------------------- | |
7 */ | |
8 | |
9 #include "types.h" | |
10 #include "extern.h" | |
11 #include "opcmap.h" | |
12 #include "syn.h" | |
13 | |
14 /* ----------------------------------------------------------------------------- | |
15 * opr_cast() - Prints an operand cast. | |
16 * ----------------------------------------------------------------------------- | |
17 */ | |
18 static void | |
19 opr_cast(struct ud* u, struct ud_operand* op) | |
20 { | |
21 switch(op->size) { | |
22 case 16 : case 32 : | |
23 mkasm(u, "*"); break; | |
24 default: break; | |
25 } | |
26 } | |
27 | |
28 /* ----------------------------------------------------------------------------- | |
29 * gen_operand() - Generates assembly output for each operand. | |
30 * ----------------------------------------------------------------------------- | |
31 */ | |
32 static void | |
33 gen_operand(struct ud* u, struct ud_operand* op) | |
34 { | |
35 switch(op->type) { | |
36 case UD_OP_REG: | |
37 mkasm(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]); | |
38 break; | |
39 | |
40 case UD_OP_MEM: | |
41 if (u->br_far) opr_cast(u, op); | |
42 if (u->pfx_seg) | |
43 mkasm(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); | |
44 if (op->offset == 8) { | |
45 if (op->lval.sbyte < 0) | |
46 mkasm(u, "-0x%x", (-op->lval.sbyte) & 0xff); | |
47 else mkasm(u, "0x%x", op->lval.sbyte); | |
48 } | |
49 else if (op->offset == 16) | |
50 mkasm(u, "0x%x", op->lval.uword); | |
51 else if (op->offset == 32) | |
52 mkasm(u, "0x%lx", op->lval.udword); | |
53 else if (op->offset == 64) | |
54 mkasm(u, "0x" FMT64 "x", op->lval.uqword); | |
55 | |
56 if (op->base) | |
57 mkasm(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]); | |
58 if (op->index) { | |
59 if (op->base) | |
60 mkasm(u, ","); | |
61 else mkasm(u, "("); | |
62 mkasm(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]); | |
63 } | |
64 if (op->scale) | |
65 mkasm(u, ",%d", op->scale); | |
66 if (op->base || op->index) | |
67 mkasm(u, ")"); | |
68 break; | |
69 | |
70 case UD_OP_IMM: | |
71 switch (op->size) { | |
72 case 8: mkasm(u, "$0x%x", op->lval.ubyte); break; | |
73 case 16: mkasm(u, "$0x%x", op->lval.uword); break; | |
74 case 32: mkasm(u, "$0x%lx", op->lval.udword); break; | |
75 case 64: mkasm(u, "$0x" FMT64 "x", op->lval.uqword); break; | |
76 default: break; | |
77 } | |
78 break; | |
79 | |
80 case UD_OP_JIMM: | |
81 switch (op->size) { | |
82 case 8: | |
83 mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sbyte); | |
84 break; | |
85 case 16: | |
86 mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sword); | |
87 break; | |
88 case 32: | |
89 mkasm(u, "0x" FMT64 "x", u->pc + op->lval.sdword); | |
90 break; | |
91 default:break; | |
92 } | |
93 break; | |
94 | |
95 case UD_OP_PTR: | |
96 switch (op->size) { | |
97 case 32: | |
98 mkasm(u, "$0x%x, $0x%x", op->lval.ptr.seg, | |
99 op->lval.ptr.off & 0xFFFF); | |
100 break; | |
101 case 48: | |
102 mkasm(u, "$0x%x, $0x%lx", op->lval.ptr.seg, | |
103 op->lval.ptr.off); | |
104 break; | |
105 } | |
106 break; | |
107 | |
108 default: return; | |
109 } | |
110 } | |
111 | |
112 /* ============================================================================= | |
113 * translates to AT&T syntax | |
114 * ============================================================================= | |
115 */ | |
116 extern void | |
117 ud_translate_att(struct ud *u) | |
118 { | |
119 int size = 0; | |
120 | |
121 /* check if P_O32 prefix is used */ | |
122 if (! P_O32(u->mapen->prefix) && u->pfx_opr) { | |
123 switch (u->dis_mode) { | |
124 case 16: | |
125 mkasm(u, "o32 "); | |
126 break; | |
127 case 32: | |
128 case 64: | |
129 mkasm(u, "o16 "); | |
130 break; | |
131 } | |
132 } | |
133 | |
134 /* check if P_A32 prefix was used */ | |
135 if (! P_A32(u->mapen->prefix) && u->pfx_adr) { | |
136 switch (u->dis_mode) { | |
137 case 16: | |
138 mkasm(u, "a32 "); | |
139 break; | |
140 case 32: | |
141 mkasm(u, "a16 "); | |
142 break; | |
143 case 64: | |
144 mkasm(u, "a32 "); | |
145 break; | |
146 } | |
147 } | |
148 | |
149 if (u->pfx_lock) | |
150 mkasm(u, "lock "); | |
151 if (u->pfx_rep) | |
152 mkasm(u, "rep "); | |
153 if (u->pfx_repne) | |
154 mkasm(u, "repne "); | |
155 | |
156 /* special instructions */ | |
157 switch (u->mnemonic) { | |
158 case UD_Iretf: | |
159 mkasm(u, "lret "); | |
160 break; | |
161 case UD_Idb: | |
162 mkasm(u, ".byte 0x%x", u->operand[0].lval.ubyte); | |
163 return; | |
164 case UD_Ijmp: | |
165 case UD_Icall: | |
166 if (u->br_far) mkasm(u, "l"); | |
167 mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic)); | |
168 break; | |
169 case UD_Ibound: | |
170 case UD_Ienter: | |
171 if (u->operand[0].type != UD_NONE) | |
172 gen_operand(u, &u->operand[0]); | |
173 if (u->operand[1].type != UD_NONE) { | |
174 mkasm(u, ","); | |
175 gen_operand(u, &u->operand[1]); | |
176 } | |
177 return; | |
178 default: | |
179 mkasm(u, "%s", ud_lookup_mnemonic(u->mnemonic)); | |
180 } | |
181 | |
182 if (u->c1) | |
183 size = u->operand[0].size; | |
184 else if (u->c2) | |
185 size = u->operand[1].size; | |
186 else if (u->c3) | |
187 size = u->operand[2].size; | |
188 | |
189 if (size == 8) | |
190 mkasm(u, "b"); | |
191 else if (size == 16) | |
192 mkasm(u, "w"); | |
193 else if (size == 64) | |
194 mkasm(u, "q"); | |
195 | |
196 mkasm(u, " "); | |
197 | |
198 if (u->operand[2].type != UD_NONE) { | |
199 gen_operand(u, &u->operand[2]); | |
200 mkasm(u, ", "); | |
201 } | |
202 | |
203 if (u->operand[1].type != UD_NONE) { | |
204 gen_operand(u, &u->operand[1]); | |
205 mkasm(u, ", "); | |
206 } | |
207 | |
208 if (u->operand[0].type != UD_NONE) | |
209 gen_operand(u, &u->operand[0]); | |
210 } |