]>
git.saurik.com Git - apple/javascriptcore.git/blob - disassembler/udis86/udis86_syn-att.c
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.
30 #include "udis86_types.h"
31 #include "udis86_extern.h"
32 #include "udis86_decode.h"
33 #include "udis86_itab.h"
34 #include "udis86_syn.h"
36 /* -----------------------------------------------------------------------------
37 * opr_cast() - Prints an operand cast.
38 * -----------------------------------------------------------------------------
41 opr_cast(struct ud
* u
, struct ud_operand
* op
)
50 /* -----------------------------------------------------------------------------
51 * gen_operand() - Generates assembly output for each operand.
52 * -----------------------------------------------------------------------------
55 gen_operand(struct ud
* u
, struct ud_operand
* op
)
59 mkasm(u
, "%%%s", ud_reg_tab
[op
->base
- UD_R_AL
]);
63 if (u
->br_far
) opr_cast(u
, op
);
65 mkasm(u
, "%%%s:", ud_reg_tab
[u
->pfx_seg
- UD_R_AL
]);
66 if (op
->offset
== 8) {
67 if (op
->lval
.sbyte
< 0)
68 mkasm(u
, "-0x%x", (-op
->lval
.sbyte
) & 0xff);
69 else mkasm(u
, "0x%x", op
->lval
.sbyte
);
71 else if (op
->offset
== 16)
72 mkasm(u
, "0x%x", op
->lval
.uword
);
73 else if (op
->offset
== 32)
74 mkasm(u
, "0x%lx", (unsigned long)op
->lval
.udword
);
75 else if (op
->offset
== 64)
76 mkasm(u
, "0x" FMT64
"x", op
->lval
.uqword
);
79 mkasm(u
, "(%%%s", ud_reg_tab
[op
->base
- UD_R_AL
]);
84 mkasm(u
, "%%%s", ud_reg_tab
[op
->index
- UD_R_AL
]);
87 mkasm(u
, ",%d", op
->scale
);
88 if (op
->base
|| op
->index
)
94 uint64_t sext_mask
= 0xffffffffffffffffull
;
95 unsigned sext_size
= op
->size
;
98 case 8: imm
= op
->lval
.sbyte
; break;
99 case 16: imm
= op
->lval
.sword
; break;
100 case 32: imm
= op
->lval
.sdword
; break;
101 case 64: imm
= op
->lval
.sqword
; break;
103 if ( P_SEXT( u
->itab_entry
->prefix
) ) {
104 sext_size
= u
->operand
[ 0 ].size
;
105 if ( u
->mnemonic
== UD_Ipush
)
106 /* push sign-extends to operand size */
107 sext_size
= u
->opr_mode
;
109 if ( sext_size
< 64 )
110 sext_mask
= ( 1ull << sext_size
) - 1;
111 mkasm( u
, "$0x" FMT64
"x", imm
& sext_mask
);
119 mkasm(u
, "0x" FMT64
"x", u
->pc
+ op
->lval
.sbyte
);
122 mkasm(u
, "0x" FMT64
"x", (u
->pc
+ op
->lval
.sword
) & 0xffff );
125 if (u
->dis_mode
== 32)
126 mkasm(u
, "0x" FMT64
"x", (u
->pc
+ op
->lval
.sdword
) & 0xffffffff);
128 mkasm(u
, "0x" FMT64
"x", u
->pc
+ op
->lval
.sdword
);
137 mkasm(u
, "$0x%x, $0x%x", op
->lval
.ptr
.seg
,
138 op
->lval
.ptr
.off
& 0xFFFF);
141 mkasm(u
, "$0x%x, $0x%lx", op
->lval
.ptr
.seg
,
142 (unsigned long)op
->lval
.ptr
.off
);
151 /* =============================================================================
152 * translates to AT&T syntax
153 * =============================================================================
156 ud_translate_att(struct ud
*u
)
160 /* check if P_OSO prefix is used */
161 if (! P_OSO(u
->itab_entry
->prefix
) && u
->pfx_opr
) {
162 switch (u
->dis_mode
) {
173 /* check if P_ASO prefix was used */
174 if (! P_ASO(u
->itab_entry
->prefix
) && u
->pfx_adr
) {
175 switch (u
->dis_mode
) {
195 /* special instructions */
196 switch (u
->mnemonic
) {
201 mkasm(u
, ".byte 0x%x", u
->operand
[0].lval
.ubyte
);
205 if (u
->br_far
) mkasm(u
, "l");
206 mkasm(u
, "%s", ud_lookup_mnemonic(u
->mnemonic
));
210 if (u
->operand
[0].type
!= UD_NONE
)
211 gen_operand(u
, &u
->operand
[0]);
212 if (u
->operand
[1].type
!= UD_NONE
) {
214 gen_operand(u
, &u
->operand
[1]);
218 mkasm(u
, "%s", ud_lookup_mnemonic(u
->mnemonic
));
222 size
= u
->operand
[0].size
;
224 size
= u
->operand
[1].size
;
226 size
= u
->operand
[2].size
;
237 if (u
->operand
[2].type
!= UD_NONE
) {
238 gen_operand(u
, &u
->operand
[2]);
242 if (u
->operand
[1].type
!= UD_NONE
) {
243 gen_operand(u
, &u
->operand
[1]);
247 if (u
->operand
[0].type
!= UD_NONE
)
248 gen_operand(u
, &u
->operand
[0]);
251 #endif // USE(UDIS86)