1 /* udis86 - libudis86/syn-att.c
3 * Copyright (c) 2002-2009 Vivek Thampi
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
9 * * Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
22 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 /* -----------------------------------------------------------------------------
34 * opr_cast() - Prints an operand cast.
35 * -----------------------------------------------------------------------------
38 opr_cast(struct ud* u, struct ud_operand* op)
42 ud_asmprintf(u, "*"); break;
47 /* -----------------------------------------------------------------------------
48 * gen_operand() - Generates assembly output for each operand.
49 * -----------------------------------------------------------------------------
52 gen_operand(struct ud* u, struct ud_operand* op)
56 ud_asmprintf(u, "$0x%x", op->lval.udword);
60 ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]);
68 ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]);
70 if (op->offset != 0) {
71 ud_syn_print_mem_disp(u, op, 0);
74 ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]);
82 ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]);
85 ud_asmprintf(u, ",%d", op->scale);
87 if (op->base || op->index) {
94 ud_syn_print_imm(u, op);
98 ud_syn_print_addr(u, ud_syn_rel_target(u, op));
104 ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg,
105 op->lval.ptr.off & 0xFFFF);
108 ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg,
118 /* =============================================================================
119 * translates to AT&T syntax
120 * =============================================================================
123 ud_translate_att(struct ud *u)
128 /* check if P_OSO prefix is used */
129 if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) {
130 switch (u->dis_mode) {
132 ud_asmprintf(u, "o32 ");
136 ud_asmprintf(u, "o16 ");
141 /* check if P_ASO prefix was used */
142 if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) {
143 switch (u->dis_mode) {
145 ud_asmprintf(u, "a32 ");
148 ud_asmprintf(u, "a16 ");
151 ud_asmprintf(u, "a32 ");
157 ud_asmprintf(u, "lock ");
159 ud_asmprintf(u, "rep ");
160 } else if (u->pfx_rep) {
161 ud_asmprintf(u, "repe ");
162 } else if (u->pfx_repne) {
163 ud_asmprintf(u, "repne ");
166 /* special instructions */
167 switch (u->mnemonic) {
169 ud_asmprintf(u, "lret ");
172 ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte);
176 if (u->br_far) ud_asmprintf(u, "l");
177 if (u->operand[0].type == UD_OP_REG) {
180 ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
184 if (u->operand[0].type != UD_NONE)
185 gen_operand(u, &u->operand[0]);
186 if (u->operand[1].type != UD_NONE) {
187 ud_asmprintf(u, ",");
188 gen_operand(u, &u->operand[1]);
192 ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic));
196 ud_asmprintf(u, "b");
198 ud_asmprintf(u, "w");
200 ud_asmprintf(u, "q");
203 ud_asmprintf(u, " *");
205 ud_asmprintf(u, " ");
208 if (u->operand[2].type != UD_NONE) {
209 gen_operand(u, &u->operand[2]);
210 ud_asmprintf(u, ", ");
213 if (u->operand[1].type != UD_NONE) {
214 gen_operand(u, &u->operand[1]);
215 ud_asmprintf(u, ", ");
218 if (u->operand[0].type != UD_NONE)
219 gen_operand(u, &u->operand[0]);
223 vim: set ts=2 sw=2 expandtab