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

📄 jsmain.cpp

📁 单片机宏汇编器的源程序。给一些爱好者作为学习编译原理和 C 程序设计的例子.
💻 CPP
字号:
//---------------------------------------------------------------------------
// JsMain.cpp
//---------------------------------------------------------------------------
/*
                    MCS-51系列宏汇编器(ZLG51)

    该宏汇编器采用DOS命令行方式执行,可带有各种编译参数。
    功能:与Keil公司的A51宏汇编器兼容。输入asm汇编源文件,生成obj和lst文件。
    设计方法:面向对象的程序设计方法。
    开发环境:采用Borland C++ Builder 5.0集成环境来编码、调试和编译运行。

*/
//---------------------------------------------------------------------------
#include "JsGlobal_H.h"
#include "MAsmber_H.h"
#include "OBJ_Viewer_H.h"
//---------------------------------------------------------------------------

#define DebugKit(str)    //DebugGlob(str)

//#define UseViewer
//#define TestArgus

//---------------------------------------------------------------------------
const int8u AllowArguSum = 32; // 在一个命令行中允许的最多的参数个数。
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 从源字串s(通常是命令行)中取得一个参数字串,head带值返回该参数字串的首址。
// 该函数返回值为参数字串尾址+1。
// 参数是以空格或'\0'等不可见符分隔的字符串。
//            "   Ab\*(34)cd     1234   sff   "
//             ^  ^         ^
//             s  head      tail
//---------------------------------------------------------------------------
char* GetArgv(char* s, char* &head)
{ Assert( if(s==NULL) { FatalErr("\nERR:GetArgv(s==NULL)!"); } // endif
        );
  head = s;
  while( *head != '\0' && IsInvisibleChar(*head) )
   { ++head; } // end while   移到一个可见符上

  register char* tail = head;
  while( IsVisibleChar(*tail) ) { ++tail; } // end while   移到一个不可见符上
  return tail;
} // end GetArgv
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 对源串s中的参数进行分隔,返回所得的参数的个数。
// 数组rv中装有各参数的首址,且各参数自成一个字串,其末尾为'\0'。
// 注意,源串s被修改。rv[0]保留。参数首址从rv[1]开始存放。
// 要求数组rv空间应足够,否则访问越界。
//---------------------------------------------------------------------------
int SeperateArgv(char* s, char* rv[])
{ int count = 1;        // !! 参数首址从rv[1]开始存放。
  register char* Head;
  register char* Tail;
  while( *(Tail = GetArgv(s, Head)) != '\0' )
   { Assert( if(count >= AllowArguSum)
              { FatalErr("\nAccess overflow in SeperateArgv!"); } // endif
           );
     rv[count++] = Head;
     *Tail = '\0';
     s = Tail + 1;
   } // end while
  return count;
} // end SeperateArgv
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// 一次对一个主文件进行汇编,环境由输入的参数决定。
// 该函数创建一个宏汇编器对象,调用该对象的AssembleFile服务,把源文件名作为
// 参数传递给它。AssembleFile服务将返回一个ERR值,报告汇编是否成功。
// 如果激活了UseViewer参数,则当汇编成功时,使用目标文件查看器OBJ_Viewer查看
// 刚刚产生出来的obj文件,查看内容写在"目标文件名.vew"文件中。(调试用。)
//---------------------------------------------------------------------------
void AsmOneFile(int argcc, char* argvv[])
{ DebugKit( printf("\n>>>>>>>>>>>>\n"); printf("argcc=[%d]",argcc);
            for(int i = 0; i<=argcc; ++i)
             { printf("\n--->%s", argvv[i]); } // end for
          );

  MacroAsmber masm(argcc, argvv);        // 初始化宏汇编器对象

  Jstring srcFname = "test.asm";
  if(argcc > 1)
   { srcFname = argvv[1]; srcFname.Trim('\"'); } // endif

  ERR err = masm.AssembleFile(srcFname); // 宏汇编器调用"汇编源程序"服务

#ifdef UseViewer
  if(!err)
   { OBJ_Viewer viewer;
     viewer.ViewBy(masm.GetOBJfileName(), masm.GetOBJfileName()+ ".vew");
   } // endif
#endif

  if(err) { printf("\n=== Please check your program. ===\n"); } // endif
  else    { printf("\n==== Assembly completed. ====\n"); } // end else

} // end AsmOneFile
//---------------------------------------------------------------------------
#pragma hdrstop


#include "Jstring_H.h"

#pragma argsused
//---------------------------------------------------------------------------
//
//                              主函数体
//
// 进入主程序,首先在屏幕上显示版头,版本号等。
// 如果激活TestArgus开关,则把输入的命令行中的各参数写到"Jamesyzzf.zzf"文件
// 上。(供调试用。)
// 如果输入的参数个数大于1,而且源文件名以'@'开头,则把该字符之后的文件名所
// 指示的文件作为文本文件读入,其内容作为新的命令行参数。
// 然后调用AsmOneFile()对源文件进行汇编。
// 如果程序正确运行结束的话,将返回零值。
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{ printf("====== 51系列宏汇编器 内部版本: %s ======", MyVersion);
  printf("\n=====  周立功单片机发展有限公司 2003. =====");
  printf("\n ============ Programmer: 郑智峰. ========");
  // GO here...


#ifdef TestArgus
  FILE* vfp = fopen("Jamesyzzf.zzf","w");
  if(vfp==NULL) { printf("Cannot write disk!"); } // endif
  fprintf(vfp,">>>>>>>>>>>>\nargc=[%d]",argc);
  for(int i = 0; i<=argc; ++i)
   { fprintf(vfp,"\nargv[%d]=%s",i,argv[i]); } // end for
#endif

  // ......................................................
  if(argc > 1 && *argv[1] == '@')
   { static char* argvv[AllowArguSum] =
     { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,  0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
     for(int i = 0; i < argc; ++i) { argvv[i] = argv[i]; } // end for

     FILE *fp = fopen(argv[1]+1,"r");
     if(fp == NULL) { FatalErr("\n@File open err!"); } // endif
     char buf[256];
     for(register int16u i = 0; i < 256; ++i)
      { buf[i] = 0; } // end for
     fgets(buf,255,fp);

#ifdef TestArgus
     fprintf(vfp, "\nFileLine[%s]",buf);
#endif

     int argcc = SeperateArgv(buf, argvv);
     AsmOneFile(argcc, argvv);
     fclose(fp);
   } // endif
  else
   { AsmOneFile(argc, argv); } // end else
  // ......................................................
#ifdef TestArgus
  fclose(vfp);
#endif

  // Finished...
  DebugKit(puts("\nPress Enter to quit..."); WaitEnter;);

  return 0;
} // end main
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// end JsMain.cpp
//---------------------------------------------------------------------------
//               Written by JamesyFront.    ZLGmcu Dev.Co.Ltd.  2002.
//---------------------------------------------------------------------------



⌨️ 快捷键说明

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