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

📄 run.c

📁 MCS51系列单片机的汇编器
💻 C
字号:
#include <stdio.h>#include <setjmp.h>#include <stdarg.h>#include <stdlib.h>#include <string.h>#include "as31.h"/* global variables */unsigned long lc;char *asmfile;int fatal=0, abort_asap=0;int pass=0;int dashl=0;FILE *listing=NULL, *fin=NULL;int run_as31(const char *infile, int lst, int use_stdout,	const char *fmt, const char *arg){	char *outfile=NULL, *lstfile=NULL;	const char *extension;	int has_dot_asm=0;	int len, baselen, extlen;	/* first, figure out all the file names */	dashl = lst;	extension = emit_extension(fmt);	extlen = strlen(extension);	len = baselen = strlen(infile);	if (len >= 4 && strcasecmp(infile + len - 4, ".asm") == 0) {		has_dot_asm = 1;		baselen -= 4;	}		asmfile = (char *)malloc(baselen + 5);	strcpy(asmfile, infile);	if (dashl) {		lstfile = (char *)malloc(baselen + 5);		strncpy(lstfile, infile, baselen);		strcpy(lstfile + baselen, ".lst");	}	if (use_stdout) {		outfile = NULL;	} else {		outfile = (char *)malloc(baselen + extlen + 2);		strncpy(outfile, infile, baselen);		*(outfile + baselen) = '.';		strcpy(outfile + baselen + 1, extension);	}	/* now open the files */	fin = freopen(asmfile, "r", stdin);	if (fin == NULL) {		if (!has_dot_asm) {			strcpy(asmfile + baselen, ".asm");			fin = freopen(asmfile, "r", stdin);		}		if (fin == NULL) {			mesg_f("Cannot open input file: %s\n", asmfile);			free(asmfile);			if (outfile) free(outfile);			if (lstfile) free(lstfile);			return -1;		}	}	if (dashl) {		listing = fopen(lstfile,"w");		if( listing == NULL ) {			mesg_f("Cannot open file: %s for writing.\n",				lstfile);			fclose(fin);			free(asmfile);			if (outfile) free(outfile);			if (lstfile) free(lstfile);			return -1;		}	}	/* what happens if this doesn't work */	emitopen(outfile, fmt, arg);	syminit();	clear_location_counter();	fatal = abort_asap = 0;	lineno = 1;	pass=0;	lc = 0;	/*	** P A S S    1	*/	if (!use_stdout) mesg_f("Begin Pass #1\n");	yyparse();	if (fatal) {		mesg_f("Errors in pass1, assembly aborted\n");	} else {		rewind(fin);		lineno = 1;		pass++;		lc = 0;		emitaddr(lc);		/*		** P A S S    2		*/        	if (!use_stdout) mesg_f("Begin Pass #2\n");		yyparse();	}	if (fatal) {		mesg_f("Errors in pass2, assembly aborted\n");	}	emitclose();	fclose(fin);	if (dashl) fclose(listing);	free(asmfile);	if (outfile) free(outfile);	if (lstfile) free(lstfile);	freesym();	if (fatal) return -1;	return 0;}	/* the parser, lexer and other stuff that actually do the *//* assembly will call to these two functions to report any *//* errors or warning.  error() calls exit() in the command *//* line version, but the abort_asap flag was added, and the *//* parser check it at the end of every line */void error(const char *fmt, ...){	va_list args;	char buf[2048];	int len;	abort_asap++;        fatal++;	va_start(args, fmt);	len = snprintf(buf, sizeof(buf), "Error, line %d, ", lineno);	len += vsnprintf(buf + len, sizeof(buf) - len, fmt, args);	snprintf(buf + len, sizeof(buf) - len, ".\n");	mesg(buf);}void warn(const char *fmt, ...){	va_list args;	char buf[2048];	int len;        fatal++;	va_start(args, fmt);	len = snprintf(buf, sizeof(buf), "Warning, line %d, ", lineno);	len += vsnprintf(buf + len, sizeof(buf) - len, fmt, args);	snprintf(buf + len, sizeof(buf) - len, ".\n");	mesg(buf);}void mesg_f(const char *fmt, ...){	va_list args;	char buf[2048];	va_start(args, fmt);	vsnprintf(buf, sizeof(buf), fmt, args);	mesg(buf);}

⌨️ 快捷键说明

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