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