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

📄 pdp11.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "defs"#if FAMILY == DMR#	include "dmrdefs"#endif#if FAMILY==SCJ && OUTPUT==BINARY#	include "scjdefs"#endif/*      PDP 11-SPECIFIC PRINTING ROUTINES*/int maxregvar = 0;static char textline[50];int regnum[] = { 3, 2 };prsave(){}goret(type)int type;{#if  FAMILY == DMR	p2op(P2RETURN);#endif#if FAMILY==SCJ	p2pass(sprintf(textline, "\tjmp\tcret"));#endif}/* * move argument slot arg1 (relative to ap) * to slot arg2 (relative to ARGREG) */mvarg(type, arg1, arg2)int type, arg1, arg2;{mvarg1(arg1+4, arg2);if(type == TYLONG)	mvarg1(arg1+6, arg2+2);}mvarg1(m, n)int m, n;{#if FAMILY == DMR	p2reg(ARGREG, P2SHORT|P2PTR);	p2op2(P2ICON, P2SHORT);	p2i(n);	p2op2(P2PLUS, P2SHORT|P2PTR);	p2op2(P2INDIRECT, P2SHORT);	p2reg(AUTOREG, P2SHORT|P2PTR);	p2op2(P2ICON, P2SHORT);	p2i(m);	p2op2(P2PLUS, P2SHORT|P2PTR);	p2op2(P2INDIRECT, P2SHORT);	p2op2(P2ASSIGN, P2SHORT);	putstmt();#endif#if FAMILY == SCJ	p2pass(sprintf(textline, "\tmov\t%d.(r5),%d.(r4)", m, n));#endif}prlabel(fp, k)FILEP fp;int k;{fprintf(fp, "L%d:\n", k);}prconi(fp, type, n)FILEP fp;int type;ftnint n;{register int *np;np = &n;if(type == TYLONG)	fprintf(fp, "\t%d.;%d.\n", np[0], np[1]);else	fprintf(fp, "\t%d.\n", np[1]);}prcona(fp, a)FILEP fp;ftnint a;{fprintf(fp, "L%ld\n", a);}#if HERE!=PDP11BAD NEWS#endif#if HERE==PDP11prconr(fp, type, x)FILEP fp;int type;double x;{register int k, *n;n = &x;	/* nonportable cheat */k = (type==TYREAL ? 2 : 4);fprintf(fp, "\t");while(--k >= 0)	fprintf(fp, "%d.%c", *n++, (k==0 ? '\n' : ';') );}#endifpreven(k)int k;{if(k > 1)	fprintf(asmfile, "\t.even\n", k);}#if FAMILY == SCJprcmgoto(p, nlab, skiplabel, labarray)expptr p;int nlab, skiplabel, labarray;{int regno;putforce(p->vtype, p);if(p->vtype == TYLONG)	{	regno = 1;	p2pass(sprintf(textline, "\ttst\tr0"));	p2pass(sprintf(textline, "\tbne\tL%d", skiplabel));	}else	regno = 0;p2pass(sprintf(textline, "\tcmp\tr%d,$%d.", regno, nlab));p2pass(sprintf(textline, "\tbhi\tL%d", skiplabel));p2pass(sprintf(textline, "\tasl\tr%d", regno));p2pass(sprintf(textline, "\tjmp\t*L%d(r%d)", labarray, regno));}prarif(p, neg,zer,pos)expptr p;int neg, zer, pos;{register int ptype;putforce( ptype = p->vtype, p);if( ISINT(ptype) )	{	p2pass(sprintf(textline, "\ttst\tr0"));	p2pass(sprintf(textline, "\tjlt\tL%d", neg));	p2pass(sprintf(textline, "\tjgt\tL%d", pos));	if(ptype != TYSHORT)		{		p2pass(sprintf(textline, "\ttst\tr1"));		p2pass(sprintf(textline, "\tjeq\tL%d", zer));		}	p2pass(sprintf(textline, "\tjbr\tL%d", pos));	}else	{	p2pass(sprintf(textline, "\ttstf\tr0"));	p2pass(sprintf(textline, "\tcfcc"));	p2pass(sprintf(textline, "\tjeq\tL%d", zer));	p2pass(sprintf(textline, "\tjlt\tL%d", neg));	p2pass(sprintf(textline, "\tjmp\tL%d", pos));	}}#endifchar *memname(stg, mem)int stg, mem;{static char s[20];switch(stg)	{	case STGCOMMON:	case STGEXT:		sprintf(s, "_%s", varstr(XL, extsymtab[mem].extname) );		break;	case STGBSS:	case STGINIT:		sprintf(s, "v.%d", mem);		break;	case STGCONST:		sprintf(s, "L%d", mem);		break;	case STGEQUIV:		sprintf(s, "q.%d", mem);		break;	default:		fatal1("memname: invalid vstg %d", stg);	}return(s);}prlocvar(s, len)char *s;ftnint len;{fprintf(asmfile, "%s:", s);prskip(asmfile, len);}prext(name, leng, init)char *name;ftnint leng;int init;{if(leng==0 || init)	fprintf(asmfile, "\t.globl\t_%s\n", name);else	fprintf(asmfile, "\t.comm\t_%s,%ld.\n", name, leng);}prendproc(){}prtail(){#if FAMILY == SCJ	p2pass(sprintf(textline, "\t.globl\tcsv,cret"));#else	p2op(P2EOF);#endif}prolog(ep, argvec)struct entrypoint *ep;struct addrblock *argvec;{int i, argslot, proflab;register chainp p;register struct nameblock *q;register struct dimblock *dp;struct constblock *mkaddcon();if(procclass == CLMAIN)	prentry("MAIN__");if(ep->entryname)	prentry( varstr(XL, ep->entryname->extname) );if(procclass == CLBLOCK)	return;if(profileflag)	proflab = newlabel();#if FAMILY == SCJ	if(profileflag)		{		fprintf(asmfile, "L%d:\t. = .+2\n", proflab);		p2pass(sprintf(textline, "\tmov\t$L%d,r0", proflab));		p2pass(sprintf(textline, "\tjsr\tpc,mcount"));		}	p2pass(sprintf(textline, "\tjsr\tr5,csv"));	p2pass(sprintf(textline, "\tsub\t$.F%d,sp", procno));#else	if(profileflag)		p2op2(P2PROFILE, proflab);	p2op(P2SAVE);	p2op2(P2SETSTK, ( (((int) autoleng)+1) & ~01) );#endifif(argvec == NULL)	addreg(argloc = 4);else	{	addreg( argloc = argvec->memoffset->const.ci );	if(proctype == TYCHAR)		{		mvarg(TYADDR, 0, chslot);		mvarg(TYLENG, SZADDR, chlgslot);		argslot = SZADDR + SZLENG;		}	else if( ISCOMPLEX(proctype) )		{		mvarg(TYADDR, 0, cxslot);		argslot = SZADDR;		}	else		argslot = 0;	for(p = ep->arglist ; p ; p =p->nextp)		{		q = p->datap;		mvarg(TYADDR, argslot, q->vardesc.varno);		argslot += SZADDR;		}	for(p = ep->arglist ; p ; p = p->nextp)		{		q = p->datap;		if(q->vtype==TYCHAR || q->vclass==CLPROC)			{			if( q->vleng && ! ISCONST(q->vleng) )				mvarg(TYLENG, argslot, q->vleng->memno);			argslot += SZLENG;			}		}	}for(p = ep->arglist ; p ; p = p->nextp)	if(dp = ( (struct nameblock *) (p->datap) ) ->vdim)		{		for(i = 0 ; i < dp->ndim ; ++i)			if(dp->dims[i].dimexpr)				puteq( fixtype(cpexpr(dp->dims[i].dimsize)),					fixtype(cpexpr(dp->dims[i].dimexpr)));		if(dp->basexpr)			puteq( 	cpexpr(fixtype(dp->baseoffset)),				cpexpr(fixtype(dp->basexpr)));		}if(typeaddr)	puteq( cpexpr(typeaddr), mkaddcon(ep->typelabel) );putgoto(ep->entrylabel);}prentry(s)char *s;{#if FAMILY == SCJ	p2pass(sprintf(textline, "_%s:", s));#else	p2op(P2RLABEL);	putc('_', textfile);	p2str(s);#endif}addreg(k)int k;{#if FAMILY == SCJ	p2pass(sprintf(textline, "\tmov\tr5,r4"));	p2pass(sprintf(textline, "\tadd\t$%d.,r4", k));#else	p2reg(ARGREG, P2SHORT);	p2reg(AUTOREG, P2SHORT);	p2op2(P2ICON, P2SHORT);	p2i(k);	p2op2(P2PLUS, P2SHORT);	p2op2(P2ASSIGN, P2SHORT);	putstmt();#endif}prhead(fp)FILEP fp;{#if FAMILY==SCJ#	if OUTPUT == BINARY		p2triple(P2LBRACKET, ARGREG-1-highregvar, procno);		p2word( (long) (BITSPERCHAR*autoleng) );		p2flush();#	else		fprintf(fp, "[%02d\t%06ld\t%02d\t\n", procno,			BITSPERCHAR*autoleng, ARGREG-1-highregvar);#	endif#endif}prdbginfo(){register char *s;char *t, buff[50];register struct nameblock *p;struct hashentry *hp;if(s = entries->entryname->extname)	s = varstr(XL, s);else if(procclass == CLMAIN)	s = "MAIN__";else	return;if(procclass != CLBLOCK)	fprintf(asmfile, "~~%s = _%s\n", s, s);for(hp = hashtab ; hp<lasthash ; ++hp)    if(p = hp->varp)	{	s = NULL;	if(p->vstg == STGARG)		s = sprintf(buff, "%o", p->vardesc.varno+argloc);	else if(p->vclass == CLVAR)		switch(p->vstg)			{			case STGBSS:			case STGINIT:			case STGEQUIV:				t = memname(p->vstg, p->vardesc.varno);				if(p->voffset)					s = sprintf(buff, "%s+%o", t, p->voffset);				else					s = sprintf(buff, "%s", t);				break;			case STGAUTO:				s = sprintf(buff, "%o", p->voffset);				break;			default:				break;			}	if(s)		fprintf(asmfile, "~%s = %s\n", varstr(VL,p->varname), s);	}fprintf(asmfile, "~~:\n");}

⌨️ 快捷键说明

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