📄 jsmain.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 + -