]>
git.saurik.com Git - apple/javascriptcore.git/blob - disassembler/udis86/udis86_syn-intel.c
1 /* udis86 - libudis86/syn-intel.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
)
44 case 8: mkasm(u
, "byte " ); break;
45 case 16: mkasm(u
, "word " ); break;
46 case 32: mkasm(u
, "dword "); break;
47 case 64: mkasm(u
, "qword "); break;
48 case 80: mkasm(u
, "tword "); break;
55 /* -----------------------------------------------------------------------------
56 * gen_operand() - Generates assembly output for each operand.
57 * -----------------------------------------------------------------------------
59 static void gen_operand(struct ud
* u
, struct ud_operand
* op
, int syn_cast
)
63 mkasm(u
, "%s", ud_reg_tab
[op
->base
- UD_R_AL
]);
76 mkasm(u
, "%s:", ud_reg_tab
[u
->pfx_seg
- UD_R_AL
]);
79 mkasm(u
, "%s", ud_reg_tab
[op
->base
- UD_R_AL
]);
86 mkasm(u
, "%s", ud_reg_tab
[op
->index
- UD_R_AL
]);
91 mkasm(u
, "*%d", op
->scale
);
93 if (op
->offset
== 8) {
94 if (op
->lval
.sbyte
< 0)
95 mkasm(u
, "-0x%x", -op
->lval
.sbyte
);
96 else mkasm(u
, "%s0x%x", (op_f
) ? "+" : "", op
->lval
.sbyte
);
98 else if (op
->offset
== 16)
99 mkasm(u
, "%s0x%x", (op_f
) ? "+" : "", op
->lval
.uword
);
100 else if (op
->offset
== 32) {
101 if (u
->adr_mode
== 64) {
102 if (op
->lval
.sdword
< 0)
103 mkasm(u
, "-0x%x", -op
->lval
.sdword
);
104 else mkasm(u
, "%s0x%x", (op_f
) ? "+" : "", op
->lval
.sdword
);
106 else mkasm(u
, "%s0x%lx", (op_f
) ? "+" : "", (unsigned long)op
->lval
.udword
);
108 else if (op
->offset
== 64)
109 mkasm(u
, "%s0x" FMT64
"x", (op_f
) ? "+" : "", (uint64_t)op
->lval
.uqword
);
117 uint64_t sext_mask
= 0xffffffffffffffffull
;
118 unsigned sext_size
= op
->size
;
123 case 8: imm
= op
->lval
.sbyte
; break;
124 case 16: imm
= op
->lval
.sword
; break;
125 case 32: imm
= op
->lval
.sdword
; break;
126 case 64: imm
= op
->lval
.sqword
; break;
128 if ( P_SEXT( u
->itab_entry
->prefix
) ) {
129 sext_size
= u
->operand
[ 0 ].size
;
130 if ( u
->mnemonic
== UD_Ipush
)
131 /* push sign-extends to operand size */
132 sext_size
= u
->opr_mode
;
134 if ( sext_size
< 64 )
135 sext_mask
= ( 1ull << sext_size
) - 1;
136 mkasm( u
, "0x" FMT64
"x", (uint64_t)(imm
& sext_mask
) );
143 if (syn_cast
) opr_cast(u
, op
);
146 mkasm(u
, "0x" FMT64
"x", (uint64_t)(u
->pc
+ op
->lval
.sbyte
));
149 mkasm(u
, "0x" FMT64
"x", (uint64_t)(( u
->pc
+ op
->lval
.sword
) & 0xffff) );
152 mkasm(u
, "0x" FMT64
"x", (uint64_t)(( u
->pc
+ op
->lval
.sdword
) & 0xfffffffful
) );
161 mkasm(u
, "word 0x%x:0x%x", op
->lval
.ptr
.seg
,
162 op
->lval
.ptr
.off
& 0xFFFF);
165 mkasm(u
, "dword 0x%x:0x%lx", op
->lval
.ptr
.seg
,
166 (unsigned long)op
->lval
.ptr
.off
);
172 if (syn_cast
) opr_cast(u
, op
);
173 mkasm(u
, "%d", op
->lval
.udword
);
180 /* =============================================================================
181 * translates to intel syntax
182 * =============================================================================
184 extern void ud_translate_intel(struct ud
* u
)
188 /* check if P_OSO prefix is used */
189 if (! P_OSO(u
->itab_entry
->prefix
) && u
->pfx_opr
) {
190 switch (u
->dis_mode
) {
201 /* check if P_ASO prefix was used */
202 if (! P_ASO(u
->itab_entry
->prefix
) && u
->pfx_adr
) {
203 switch (u
->dis_mode
) {
217 u
->operand
[0].type
!= UD_OP_MEM
&&
218 u
->operand
[1].type
!= UD_OP_MEM
) {
219 mkasm(u
, "%s ", ud_reg_tab
[u
->pfx_seg
- UD_R_AL
]);
228 /* print the instruction mnemonic */
229 mkasm(u
, "%s ", ud_lookup_mnemonic(u
->mnemonic
));
232 if (u
->operand
[0].type
!= UD_NONE
) {
234 if ( u
->operand
[0].type
== UD_OP_IMM
&&
235 u
->operand
[1].type
== UD_NONE
)
237 if ( u
->operand
[0].type
== UD_OP_MEM
) {
239 if ( u
->operand
[1].type
== UD_OP_IMM
||
240 u
->operand
[1].type
== UD_OP_CONST
)
242 if ( u
->operand
[1].type
== UD_NONE
)
244 if ( ( u
->operand
[0].size
!= u
->operand
[1].size
) && u
->operand
[1].size
)
246 } else if ( u
->operand
[ 0 ].type
== UD_OP_JIMM
) {
247 if ( u
->operand
[ 0 ].size
> 8 ) cast
= 1;
249 gen_operand(u
, &u
->operand
[0], cast
);
252 if (u
->operand
[1].type
!= UD_NONE
) {
255 if ( u
->operand
[1].type
== UD_OP_MEM
) {
258 if ( u
->operand
[0].type
!= UD_OP_REG
)
260 if ( u
->operand
[0].size
!= u
->operand
[1].size
&& u
->operand
[1].size
)
262 if ( u
->operand
[0].type
== UD_OP_REG
&&
263 u
->operand
[0].base
>= UD_R_ES
&&
264 u
->operand
[0].base
<= UD_R_GS
)
267 gen_operand(u
, &u
->operand
[1], cast
);
271 if (u
->operand
[2].type
!= UD_NONE
) {
273 gen_operand(u
, &u
->operand
[2], u
->c3
);
277 #endif // USE(UDIS86)