⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 obj_viewer_c.cpp

📁 MCS51单片机的宏汇编器源程序。有需要的朋友请下载!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
//-------- OBJ_Viewer_C.cpp -------------------------------------------------
//---------------------------------------------------------------------------
#include "OBJ_Viewer_H.h"

#include <time.h>
//---------------------------------------------------------------------------
const char* OBJ_Viewer::ppline =
"\n---------------------------------------------------------------------------";
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 把内容写到DiskFile上,NULL表示写到屏幕上。
//---------------------------------------------------------------------------
ERR OBJ_Viewer::ViewBy(const char* ObjFile, const char* DiskFile)
{ printf("\nHello! OBJ ANALIZER.");
  if(!Open(ObjFile))
   { printf("\nOpen file %s error!", ObjFile); return Have_Errs; } // endif
  if(!SetOutput(DiskFile))
   { printf("\nOpen file %s error!", DiskFile); return Have_Errs; } // endif

   fprintf(DesPt,ppline);
   fprintf(DesPt,"\nOpening file %s...",ObjFile);

   int8u pre = fgetc(SrcPt); // 预读
   while (!feof(SrcPt))
    { ungetc(pre,SrcPt);             //
      fprintf(DesPt, ppline);        //
      FindREC();                // 不断的找记录
      pre = fgetc(SrcPt);            // 预读
    } // end while

  fprintf(DesPt,ppline);
  fprintf(DesPt,"\nEnd of %s.",ObjFile);
  fprintf(DesPt,ppline);

  if(Close())
   { printf("\nView file has been written to %s.",DiskFile?DiskFile:"screen"); } // endif

  return OK_no_Err;
} // end ViewBy
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJ_Viewer::FindREC()
{ int8u ch, typ, chksum;   int16u len;

  typ = fgetc(SrcPt);
   ch = fgetc(SrcPt);
  len = fgetc(SrcPt);

  chksum = typ + ch  + len;
  len = ( len << 8 ) + ch;

  for( register int16u i = 0; i < len; ++i )
   { buf[i] = fgetc(SrcPt);
     chksum += buf[i];
   } // end for

  fprintf(DesPt, "\nREC TYPE=[%2.2XH] Len=[%4.4XH] ", typ, len);
  fprintf(DesPt, "CHKSUM=[%2.2XH] [%s]\n",buf[len-1], chksum ? "Error!" : "OK!");

  if(chksum != 0)
   { fprintf(DesPt, "Please check this record! ..."); return; } // endif

  switch(typ)
  { case 0x02: show02(buf);     break;
    case 0x04: show04(buf);     break;
    case 0x06: show06(buf,len); break;
    case 0x07: show07(buf,len); break;
    case 0x09: show09(buf,len); break;
    case 0x0f: show0F(buf,len); break;
    case 0x10: show10(buf);     break;
    case 0x12: show12(buf,len); break;
    case 0x17: show17(buf,len); break;
    case 0x19: show19(buf,len); break;
    case 0x23: show23(buf,len); break;
    case 0x24: show24(buf);     break;
    case 0x70: show70(buf);     break;
    default  : { fprintf(DesPt, "\n[???????????????????????????]"); } // end default
  } // end switch
  if(Origin) { fprintf(DesPt,"\n"); PRrec(buf, len); } // endif
} // end FindREC
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 把十六进制数转换成ASCII字符码,并显示。
//---------------------------------------------------------------------------
void OBJ_Viewer::PR_Bin2Asc(int8u* buf, int8u len)
{ fprintf(DesPt, "   [");

  for( register int8u k = 0; k < len; ++k )
   { register int8u t = buf[k];
     if( t < ' ' || t > 0x7f )
      { fprintf(DesPt, "%c",0x06); } // endif
     else
      { fprintf(DesPt, "%c",t); } // end else
   } // end for k
  fprintf(DesPt, "]\n");
} // end PR_Bin2Asc
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
#define gekai(x)     if(!(((x)+1)%4)) { fprintf(DesPt, "  "); }
//---------------------------------------------------------------------------
// 把一条记录以十六进制数显示出来。(右栏上显示ASCII字符)
//---------------------------------------------------------------------------
void OBJ_Viewer::PRrec(int8u buf[],int16u len)
{ int16u i;
  fprintf(DesPt, "\n");

  for(i = 0; i < len; ++i)
   { fprintf(DesPt, "%2.2X ",buf[i]); gekai(i);
     if( !((i+1)%16) ) { PR_Bin2Asc(buf + i - 15, 16); } // endif
   } // end for i

  int8u k = i % 16;      // k 是余数。
  if(k == 0) { return; } // endif

  for(register int8u j = k; j < 16; ++j )
   { fprintf(DesPt, "   "); gekai(j); } // end for j

  i -= k; PR_Bin2Asc(buf + i, k);
} // end PRrec
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJ_Viewer::showSEGINFO(int8u buf)
{ if( buf & 0x80 )
   { fprintf(DesPt, "\n\t[E=1] Enpty segment."); } // endif
  else
   { fprintf(DesPt, "\n\t[E=0] Not empty segment."); } // end else

  if( buf & 0x40 )
   { fprintf(DesPt, "\t\t\t[bit6=1]"); } // endif
  else
   { fprintf(DesPt, "\t\t\t[bit6=0]"); } // end else

  if( buf & 0x20 )
   { fprintf(DesPt, "\n\t[OVL=1] The segment is overlayable."); } // endif
  else
   { fprintf(DesPt, "\n\t[OVL=0] The segment is NOT overlayable."); } // end else

  fprintf(DesPt, "\n\t[SEG REG]= register bank #%d",(buf & 0x18)>>3);

  fprintf(DesPt, "\n\t[SEG TYPE]=");
  switch(buf & 0x07)
   { case 0 : fprintf(DesPt, "CODE(0)"); break;
     case 1 : fprintf(DesPt, "XDATA");   break;
     case 2 : fprintf(DesPt, "DATA");    break;
     case 3 : fprintf(DesPt, "IDATA");   break;
     case 4 : fprintf(DesPt, "BIT");     break;
     default: fprintf(DesPt, "???");
   } // end switch
} // end showSEGINFO
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void OBJ_Viewer::showSYMINFO(int8u buf)
{ if( buf & 0x80 )
   { fprintf(DesPt, "\n\t[IND=1]Procedure is indirecly_callable."); } // endif
  else
   { fprintf(DesPt, "\n\t[IND=0]Procedure is NOT indirecly_callable."); } // end else

  if( buf & 0x40 )
   { fprintf(DesPt, "\n\t[VAR=1]Public symbol is a variable."); } // endif
  else
   { fprintf(DesPt, "\n\t[VAR=0]Public symbol is NOT a variable."); } // end else

  if( buf & 0x20 )
   { fprintf(DesPt, "\n\t[RBF=1]SYM REG field is valid."); } // endif
  else
   { fprintf(DesPt, "\n\t[RBF=0]SYM REG field is NOT valid."); } // end else

  fprintf(DesPt, "\tSYM REG=#%d",(buf & 0x18)>>3);

  fprintf(DesPt, "\tUSAGE TYPE=");
  switch(buf & 0x07)
   { case 0 : fprintf(DesPt, "CODE(0)"); break;
     case 1 : fprintf(DesPt, "XDATA");   break;
     case 2 : fprintf(DesPt, "DATA");    break;
     case 3 : fprintf(DesPt, "IDATA");   break;
     case 4 : fprintf(DesPt, "BIT");     break;
     case 5 : fprintf(DesPt, "NUMBER");  break;
     default: fprintf(DesPt, "???");
   } // end switch
} // end showSYMINFO
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
int8u OBJ_Viewer::showStr(const int8u *buf)
{ for(int16u i = 1; i <= *buf; i++)       // buf[0] 是长度
   { fprintf(DesPt, "%c", buf[i]); } // end for
  return *buf+1;
} // end showStr
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//
//
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#define buf16(i)  (buf[i+1]<<8)+buf[i]
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJ_Viewer::show02(int8u buf[])
{ fprintf(DesPt, "\n[Module Header Record 02H]");
  fprintf(DesPt, "\n   [module name]=");

  int16u i = showStr(buf);  // buf[0] 是长度
  fprintf(DesPt, "\n   [TRN ID]=%2.2XH",buf[i]);

  Astring ge;
  switch(buf[i])
  { case 0xfd : ge = "ASM51"; break;
    case 0xfe : ge = "PL/M-51"; break;
    case 0xff : ge = "RL51"; break;
    default   : ge = "Unknown";
  } // end switch
  fprintf(DesPt, "\t(This module is generated by %s.)",(const char*)ge);
  ++i;

  fprintf(DesPt, "\t[unused byte]=%2.2XH",buf[i]);
} // end show02
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void OBJ_Viewer::show04(int8u buf[])
{ fprintf(DesPt, "\n[Module End Record 04H]");
  fprintf(DesPt, "\n   [module name]=");

  int16u i = showStr(buf);  // buf[0] 是长度


  fprintf(DesPt, "\t\t[unused byte]=%2.2XH %2.2XH", buf[i],buf[i+1]);
  i += 2;

  fprintf(DesPt, "\n   [REG MSK]=%2.2XH",buf[i]);
  if(buf[i])
   { fprintf(DesPt, "   Used bank");
     if(buf[i] & 0x01) { fprintf(DesPt, " #0"); }
     if(buf[i] & 0x02) { fprintf(DesPt, " #1"); }
     if(buf[i] & 0x04) { fprintf(DesPt, " #2"); }
     if(buf[i] & 0x08) { fprintf(DesPt, " #3"); }
     if(buf[i] & 0xf0) { fprintf(DesPt, " #?"); }
     fprintf(DesPt, ".");
   } // endif
  else { fprintf(DesPt, "   Not use any bank?"); } // end else
  ++i;

  fprintf(DesPt, "\t\t[unused byte]=%2.2XH",buf[i]);
} // end show04
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJ_Viewer::show06(int8u buf[], int16u rlen)
{ fprintf(DesPt, "\n[Content Record 06H]");
  int16u i = 0;

  fprintf(DesPt, "\n   [SEG ID]=%2.2X",buf[i]); ++i;

  fprintf(DesPt, "\t\t   [Offset]=%4.4X",buf16(i)); i+=2;

  fprintf(DesPt, "\n   [DAT]");
  for( ; i < rlen-1 && i<12; i++)
   { fprintf(DesPt, " %2.2X", buf[i]); } // endfor
  if(i>=12) { fprintf(DesPt, " ...... %2.2X",buf[rlen-2]); } // endif
} // end show06
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void OBJ_Viewer::show07(int8u buf[], int16u rlen)
{ fprintf(DesPt, "\n[Content Record 07H]");
  int16u i = 0;

  fprintf(DesPt, "\n   [SEG ID]=%4.4X",buf16(i));  i+=2;
  fprintf(DesPt, "\t\t   [Offset]=%4.4X",buf16(i));  i+=2;
  fprintf(DesPt, "\n   [DAT]");

  for( ; i < rlen-1 ; ++i)
   { fprintf(DesPt, " %2.2X", buf[i]);
     if(!Detail && i>=12) { break; } // endif
   } // end for

  if(!Detail) { fprintf(DesPt, " ...... %2.2X",buf[rlen-2]); } // endif
} // end show07
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void OBJ_Viewer::show09(int8u buf[], int16u rlen)
{ fprintf(DesPt, "\n[Fixup Record 09H]");
  int16u i = 0;

  while(i < rlen-1)
  { fprintf(DesPt, "\n   [Ref Loc]=%4.4X", buf16(i)); i+=2;

    fprintf(DesPt, "\t[REF TYP]=%2.2X", buf[i]);
    switch(buf[i])
    { case 0 : fprintf(DesPt, "(LOW)");  break;
      case 1 : fprintf(DesPt, "(BYTE)"); break;
      case 2 : fprintf(DesPt, "(REL)");  break;
      case 3 : fprintf(DesPt, "(HIGH)"); break;
      case 4 : fprintf(DesPt, "(WORD)"); break;
      case 5 : fprintf(DesPt, "(INBLK)");break;
      case 6 : fprintf(DesPt, "(BIT)");  break;
      case 7 : fprintf(DesPt, "(CONV)"); break;
      default: fprintf(DesPt, "(????)");
    } // end switch
    ++i;

    fprintf(DesPt, "\n  [OPERAND]: [ID BLK]=%2.2X",buf[i]);
    switch(buf[i])
    { case 0  : fprintf(DesPt, "(seg)"); break;
      case 1  : fprintf(DesPt, "(rel)"); break;
      case 2  : fprintf(DesPt, "(ext)"); break;
      default : fprintf(DesPt, "(???)");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -