i8086_dbg.h

00001 #ifndef __I8086_DBG_H__
00002 #define __I8086_DBG_H__
00003 
00004 /* Base class for various arguments for instructions */
00005 class arg
00006 {
00007     public:
00008     virtual void dump() const =0;
00009 };
00010 
00011 /* Arg such as "BX" or "CL" */
00012 class arg_reg : public arg
00013 {
00014     int     m_width; // in bits (8 or 16)
00015     int     m_id;    // register ID
00016     public:
00017     arg_reg(int width, int reg_id) : m_width(width), m_id(reg_id) {}
00018     virtual void dump() const
00019     {
00020         static const char* reg_name_8[] = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" };
00021         static const char* reg_name_16[] = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI" };
00022         fprintf(stderr, "%s", m_width==8?reg_name_8[m_id] : reg_name_16[m_id]);
00023     }   
00024 };
00025 
00026 /* Arg such as "DS" or "SS" */
00027 class arg_sreg : public arg
00028 {
00029     int     m_id;    // register ID
00030     public:
00031     arg_sreg(int reg_id) : m_id(reg_id) {}
00032     virtual void dump() const
00033     {
00034         static const char* segreg_name_16[] = {"ES", "CS", "SS", "DS" };
00035         fprintf (stderr, "%s", segreg_name_16[m_id]);
00036     }   
00037 };
00038 
00039 /* Arg such as "[mem]" */
00040 class arg_mem : public arg
00041 {
00042     int     m_width; // in bits (8 or 16)
00043     uint32  m_addr;  // address
00044     public:
00045     arg_mem(int width, uint32 addr) : m_width(width), m_addr(addr) {}
00046     virtual void dump() const
00047     {
00048         fprintf (stderr, "%s PTR [%04Xh]", m_width==8?"BYTE":"WORD", m_addr);
00049     }   
00050 };
00051 
00052 /* Arg such as [BX+SI+1234h] */
00053 class arg_ea : public arg
00054 {
00055     int m_width;
00056     int m_mod;
00057     int m_rm;
00058     int m_disp;
00059     public:
00060     arg_ea(int width, int mod, int rm, int disp) : m_width(width), m_mod(mod), m_rm(rm), m_disp(disp) {}
00061     virtual void dump() const
00062     {
00063         fprintf(stderr, "%s PTR", m_width==8?"BYTE":"WORD");
00064         switch ((m_mod << 3) + m_rm) { // combined mod and rm
00065             case  0: fprintf (stderr, "[BX+SI]"); break;
00066             case  1: fprintf (stderr, "[BX+DI]"); break;
00067             case  2: fprintf (stderr, "[BP+SI]"); break;
00068             case  3: fprintf (stderr, "[BP+DI]"); break;
00069             case  4: fprintf (stderr, "[SI]"); break;
00070             case  5: fprintf (stderr, "[DI]"); break;
00071             case  6: fprintf (stderr, "[%04Xh]", m_disp); break;
00072             case  7: fprintf (stderr, "[BX]"); break;
00073 
00074             case  8: fprintf (stderr, "[BX+SI+%04Xh]", m_disp >> 8); break;
00075             case  9: fprintf (stderr, "[BX+DI+%04Xh]", m_disp >> 8); break;
00076             case 10: fprintf (stderr, "[BP+SI+%04Xh]", m_disp >> 8); break;
00077             case 11: fprintf (stderr, "[BP+DI+%04Xh]", m_disp >> 8); break;
00078             case 12: fprintf (stderr, "[SI+%04Xh]", m_disp >> 8); break;
00079             case 13: fprintf (stderr, "[DI+%04Xh]", m_disp >> 8); break;
00080             case 14: fprintf (stderr, "[BP+%04Xh]", m_disp >> 8); break;
00081             case 15: fprintf (stderr, "[BX+%04Xh]", m_disp >> 8); break;
00082 
00083             case 16: fprintf (stderr, "[BX+SI+%04Xh]", m_disp); break;
00084             case 17: fprintf (stderr, "[BX+DI+%04Xh]", m_disp); break;
00085             case 18: fprintf (stderr, "[BP+SI+%04Xh]", m_disp); break;
00086             case 19: fprintf (stderr, "[BP+DI+%04Xh]", m_disp); break;
00087             case 20: fprintf (stderr, "[SI+%04Xh]", m_disp); break;
00088             case 21: fprintf (stderr, "[DI+%04Xh]", m_disp); break;
00089             case 22: fprintf (stderr, "[BP+%04Xh]", m_disp); break;
00090             case 23: fprintf (stderr, "[BX+%04Xh]", m_disp); break;
00091         }
00092     }   
00093 };
00094 
00095 /* Arg such as 23h or 1234h */
00096 class arg_immed : public arg
00097 {
00098     int         m_width;
00099     uint32      m_value;
00100     public:
00101     arg_immed(int width, uint32 value) : m_width(width), m_value(value) {}
00102     virtual void dump() const
00103     {
00104         fprintf (stderr, m_width==8?"%02Xh":"%04Xh", m_value);
00105     }   
00106 };
00107 
00108 #endif

Generated on Sat Sep 9 03:50:43 2006 for Openem APIs by  doxygen 1.4.7