Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

asm.cc

Go to the documentation of this file.
00001 /* 
00002  *      HT Editor
00003  *      asm.cc
00004  *
00005  *      Copyright (C) 1999-2002 Stefan Weyergraf (stefan@weyergraf.de)
00006  *
00007  *      This program is free software; you can redistribute it and/or modify
00008  *      it under the terms of the GNU General Public License version 2 as
00009  *      published by the Free Software Foundation.
00010  *
00011  *      This program is distributed in the hope that it will be useful,
00012  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *      GNU General Public License for more details.
00015  *
00016  *      You should have received a copy of the GNU General Public License
00017  *      along with this program; if not, write to the Free Software
00018  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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  *      CLASS Assembler
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  *      CLASS disassembler
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 

Generated on Fri May 7 21:15:29 2004 by doxygen 1.3.5