00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "asm.h"
00022 #include "common.h"
00023 #include "global.h"
00024 #include "htatom.h"
00025 #include "htdebug.h"
00026
00027 #include <string.h>
00028 #include <stdio.h>
00029 #include <stdarg.h>
00030
00031 #include "alphadis.h"
00032 #include "ia64dis.h"
00033 #include "ildis.h"
00034 #include "javadis.h"
00035 #include "x86dis.h"
00036 #include "ppcdis.h"
00037
00038
00039
00040
00041
00042 Assembler::Assembler(bool b)
00043 {
00044 codes = 0;
00045 bigendian = b;
00046 }
00047
00048 Assembler::~Assembler()
00049 {
00050 }
00051
00052 asm_insn *Assembler::alloc_insn()
00053 {
00054 return NULL;
00055 }
00056
00057 void Assembler::deletecode(asm_code *code)
00058 {
00059 asm_code **p=&codes, *c=codes;
00060 while (c) {
00061 if (c==code) {
00062 *p=c->next;
00063 delete c;
00064 return;
00065 }
00066 c=c->next;
00067 p=&(*p)->next;
00068 }
00069 }
00070
00071 asm_code *Assembler::encode(asm_insn *asm_insn, int _options, CPU_ADDR cur_address)
00072 {
00073 free_asm_codes();
00074 error=0;
00075 options=_options;
00076 return 0;
00077 }
00078
00079 void Assembler::clearcode()
00080 {
00081 code.size=0;
00082 }
00083
00084 void Assembler::emitbyte(byte b)
00085 {
00086 code.data[code.size] = b;
00087 code.size++;
00088 }
00089
00090 void Assembler::emitword(word w)
00091 {
00092 if (bigendian) {
00093 code.data[code.size+1] = (byte)w;
00094 code.data[code.size+0] = (byte)(w>>8);
00095 } else {
00096 code.data[code.size+0] = (byte)w;
00097 code.data[code.size+1] = (byte)(w>>8);
00098 }
00099 code.size += 2;
00100 }
00101
00102 void Assembler::emitdword(dword d)
00103 {
00104 if (bigendian) {
00105 code.data[code.size+3] = (byte)d;
00106 code.data[code.size+2] = (byte)(d>>8);
00107 code.data[code.size+1] = (byte)(d>>16);
00108 code.data[code.size+0] = (byte)(d>>24);
00109 } else {
00110 code.data[code.size+0] = (byte)d;
00111 code.data[code.size+1] = (byte)(d>>8);
00112 code.data[code.size+2] = (byte)(d>>16);
00113 code.data[code.size+3] = (byte)(d>>24);
00114 }
00115 code.size += 4;
00116 }
00117
00118 void Assembler::free_asm_codes()
00119 {
00120 while (codes) {
00121 asm_code *t=codes->next;
00122 delete codes;
00123 codes=t;
00124 }
00125 }
00126
00127 char *Assembler::get_error_msg()
00128 {
00129 return error_msg;
00130 }
00131
00132 char *Assembler::get_name()
00133 {
00134 return "generic asm";
00135 }
00136
00137 void Assembler::newcode()
00138 {
00139 code.size=0;
00140 }
00141
00142 asm_code *Assembler::shortest(asm_code *codes)
00143 {
00144 asm_code *best=0;
00145 dword bestv=0xffffffff;
00146 while (codes) {
00147 if (codes->size<bestv) {
00148 best=codes;
00149 bestv=codes->size;
00150 }
00151 codes=codes->next;
00152 };
00153 return best;
00154 }
00155
00156 void Assembler::pushcode()
00157 {
00158 asm_code **t=&codes;
00159 while (*t) {
00160 t=&(*t)->next;
00161 }
00162 *t=new asm_code;
00163
00164 memmove(*t, &code, sizeof code);
00165 (*t)->next=0;
00166 }
00167
00168 int Assembler::translate_str(asm_insn *asm_insn, const char *s)
00169 {
00170 return 0;
00171 }
00172
00173 void Assembler::set_error_msg(char *format, ...)
00174 {
00175 va_list arg;
00176 va_start(arg, format);
00177 vsprintf(error_msg, format, arg);
00178 va_end(arg);
00179 error=1;
00180 }
00181
00182 void Assembler::set_imm_eval_proc(int (*p)(void *context, char **s, dword *v), void *c)
00183 {
00184 imm_eval_proc=p;
00185 imm_eval_context=c;
00186 }
00187
00188
00189
00190
00191
00192 Disassembler::Disassembler()
00193 {
00194 disable_highlighting();
00195 }
00196
00197 Disassembler::~Disassembler()
00198 {
00199 }
00200
00201 char* (*addr_sym_func)(CPU_ADDR addr, int *symstrlen, void *context) = NULL;
00202 void* addr_sym_func_context = NULL;
00203
00204 dis_insn *Disassembler::createInvalidInsn()
00205 {
00206 return NULL;
00207 }
00208
00209 void Disassembler::hexd(char **s, int size, int options, int imm)
00210 {
00211 char ff[16];
00212 char *f = (char*)&ff;
00213 char *t = *s;
00214 *f++ = '%';
00215 if ((imm>=0) && (imm<=9)) {
00216 *s += sprintf(*s, "%d", imm);
00217 } else if (options & DIS_STYLE_SIGNED) {
00218 if (!(options & DIS_STYLE_HEX_NOZEROPAD)) f += sprintf(f, "0%d", size);
00219 *f++ = 'd';
00220 *f = 0;
00221 *s += sprintf(*s, ff, imm);
00222 } else {
00223 if (options & DIS_STYLE_HEX_CSTYLE) *f++ = '#';
00224 if (!(options & DIS_STYLE_HEX_NOZEROPAD)) f += sprintf(f, "0%d", size);
00225 if (options & DIS_STYLE_HEX_UPPERCASE) *f++ = 'X'; else
00226 *f++ = 'x';
00227 if (options & DIS_STYLE_HEX_ASMSTYLE) *f++ = 'h';
00228 *f = 0;
00229 *s += sprintf(*s, ff, imm);
00230 if ((options & DIS_STYLE_HEX_NOZEROPAD) && (*t-'0'>9)) {
00231 memmove(t+1, t, strlen(t)+1);
00232 *t = '0';
00233 (*s)++;
00234 }
00235 }
00236 }
00237
00238 bool Disassembler::selectNext(dis_insn *disasm_insn)
00239 {
00240 return false;
00241 }
00242
00243 char *Disassembler::str(dis_insn *disasm_insn, int style)
00244 {
00245 return strf(disasm_insn, style, DISASM_STRF_DEFAULT_FORMAT);
00246 }
00247
00248 const char *Disassembler::get_cs(AsmSyntaxHighlightEnum style)
00249 {
00250 const char *highlights[] = {
00251 ASM_SYNTAX_DEFAULT,
00252 ASM_SYNTAX_COMMENT,
00253 ASM_SYNTAX_NUMBER,
00254 ASM_SYNTAX_SYMBOL,
00255 ASM_SYNTAX_STRING
00256 };
00257 return (highlight) ? highlights[(int)style] : "";
00258 }
00259
00260 void Disassembler::enable_highlighting()
00261 {
00262 highlight = true;
00263 }
00264
00265 void Disassembler::disable_highlighting()
00266 {
00267 highlight = false;
00268 }
00269
00270 BUILDER(ATOM_DISASM_X86, x86dis)
00271 BUILDER(ATOM_DISASM_X86_VXD, x86dis_vxd)
00272 BUILDER(ATOM_DISASM_ALPHA, Alphadis)
00273 BUILDER(ATOM_DISASM_JAVA, javadis)
00274 BUILDER(ATOM_DISASM_IA64, IA64Disassembler)
00275 BUILDER(ATOM_DISASM_PPC, PPCDisassembler)
00276
00277 bool init_asm()
00278 {
00279 REGISTER(ATOM_DISASM_X86, x86dis)
00280 REGISTER(ATOM_DISASM_X86_VXD, x86dis_vxd)
00281 REGISTER(ATOM_DISASM_ALPHA, Alphadis)
00282 REGISTER(ATOM_DISASM_JAVA, javadis)
00283 REGISTER(ATOM_DISASM_IA64, IA64Disassembler)
00284 REGISTER(ATOM_DISASM_PPC, PPCDisassembler)
00285 return true;
00286 }
00287
00288 void done_asm()
00289 {
00290 UNREGISTER(ATOM_DISASM_PPC, PPCDisassembler)
00291 UNREGISTER(ATOM_DISASM_IA64, IA64Disassembler)
00292 UNREGISTER(ATOM_DISASM_JAVA, javadis)
00293 UNREGISTER(ATOM_DISASM_ALPHA, Alphadis)
00294 UNREGISTER(ATOM_DISASM_X86_VXD, x86dis_vxd)
00295 UNREGISTER(ATOM_DISASM_X86, x86dis)
00296 }
00297