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

📄 codegen.c

📁 编译原理课设
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 生成汇编码	*/
/* 修改:张皖龙	*/
/* 版权:GNU	*/

#include <stdlib.h>
#include "Globals.h"
#include "Parse.h"
#include "Symtab.h"

static int label_num = 0;
TreeNode * Fun;

void GenLabel(char lab[LABEL_SIZE])
{
	static int i=1;
	char temp[LABEL_SIZE];
	strcpy(lab,"L");
	_itoa(i,temp,10);
	strcat(lab,temp);
	i++;
}


void StackSegmentBegin(void)
{
	fprintf(inter_code,";*******************************************************\n");
	fprintf(inter_code,"Stack_seg\tsegment\n");
	fprintf(inter_code,"\tdw\t1024 dup(?)\n");
	fprintf(inter_code,"\ttos\tlabel\tword\n");
	fprintf(inter_code,"Stack_seg\tends\n");
	fprintf(inter_code,";*******************************************************\n");
	fprintf(inter_code,"Data_seg\tsegment\n");
}

void StackSegmentEnd(void)
{
	fprintf(inter_code,"Data_seg\tends\n");
	fprintf(inter_code,";*******************************************************\n");
}

void CodeSegmentBegin(void)
{
	fprintf(inter_code,"Code_seg\tsegment\n");
	fprintf(inter_code,"\tassume\tCS:Code_seg, DS:Data_seg, SS:Stack_seg\n");
}

void CodeSegmentEnd(void)
{
	fprintf(inter_code,"Code_seg\tends\n");
	fprintf(inter_code,"\tend\tstart\n");
	fprintf(inter_code,";*******************************************************\n");
}

void VarDec_ini(char *name, int value)//包括初值的本地变量声明
{
	int os;
	ValEntry * pEntry = malloc(sizeof(ValEntry));
	
	if(pTable ->nestlevel == 0)
		fprintf(inter_code, "\t%s\tdw\t%d\n", name, value);
	else
	{
	Lookup_Var(pTable, pTable->funEntry, name, pEntry);
	os = pEntry->offset;
			
	fprintf(inter_code, "\tPUSH\tAX\n");//为该变量占个位置,迫使sp移动
	fprintf(inter_code, "\tPUSH\tAX\n");//存值
	fprintf(inter_code, "\tMOV\tAX , %d\n", value);
	fprintf(inter_code, "\tPUSH\tBP\n");//计算变量地址
	fprintf(inter_code, "\tADD\tBP , %d\n", os);
	fprintf(inter_code, "\tMOV\tSS:[BP] , AX\n", os);//存值
	fprintf(inter_code, "\tPOP\tBP\n");
	fprintf(inter_code, "\tPOP\tAX\n");
	}
}

void VarDec(char *name)//不包括初值的本地变量声明
{
	if(pTable ->nestlevel == 0)
		fprintf(inter_code,"\t%s\tdw\t?\n",name);
	else
		fprintf(inter_code,"\tPUSH\tAX\n");//为该变量占个位置,迫使sp移动
}

void ArrDec(char *name, int entitynum)
{
	int i;
	if(pTable ->nestlevel == 0)
		fprintf(inter_code, "\t%s\tdw\t%d dup(?)\n",name, entitynum);//给数据文件
	else
		for(i = 0; i < entitynum; ++i)
			fprintf(inter_code, "\tPUSH\tAX\n");//为该变量占个位置,迫使sp移动
}

void ent(char *name, int para, int retvalue)
{
	fprintf(inter_code,"\t%s\tproc\tfar\n",name);//给代码文件
	//主函数
	if(!strcmp("main",name))
	{
		fprintf(inter_code,"start:\n");
		fprintf(inter_code,"\tMOV\tAX , Stack_seg\n");
		fprintf(inter_code,"\tMOV\tSS , AX\n");
		fprintf(inter_code,"\tMOV\tSP , offset tos\n\n");
		fprintf(inter_code,"\tPUSH\tDS\n");
		fprintf(inter_code,"\tSUB\tAX , AX\n");
		fprintf(inter_code,"\tPUSH\tAX\n\n");
		fprintf(inter_code,"\tMOV\tAX , Data_seg\n");
		fprintf(inter_code,"\tMOV\tDS , AX\n");
	}
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tPUSH\tBX\n");
	fprintf(inter_code,"\tPUSH\tCX\n");
	fprintf(inter_code,"\tPUSH\tDX\n");	
	fprintf(inter_code,"\tPUSH\tBP\n");
	fprintf(inter_code,"\tMOV\tBP , SP\n");//开始接受本地变量
}

void adi(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tADD\tAX , BX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void andi(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tAND\tAX , BX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void compound_enter(void)
{
}

void compound_exit(void)
{
pTable = pTable->parent;
}

void cup(char *name, int paranum)	//转入函数
{
	fprintf(inter_code,"\tCALL\t%s\n",name);
}

void divi(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tPUSH\tDX\n");
	fprintf(inter_code,"\tIDIV\tBX\n");
	fprintf(inter_code,"\tPOP\tDX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void equi(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num + 1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num + 1);
	label_num += 2;
}

void leave(char *name)
{
	fprintf(inter_code,"\t%s\tendp\n",name);
}

void fjp(char*label)
{
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , 0\n");
	fprintf(inter_code,"\tJE\t%s\n",label);
}

void gorei(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJGE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}

void greater(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJG\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}

void ind(char *name)
{
	if(pTable ->nestlevel == 0){
		fprintf(inter_code,"\tPOP\tBX\n");
		fprintf(inter_code,"\tPUSH\tDS:[BX]\n");
	}
	else{
		fprintf(inter_code,"\tPOP\tBX\n");
		fprintf(inter_code,"\tPUSH\tBP\n");
		fprintf(inter_code,"\tMOV\tBP , BX\n");
		fprintf(inter_code,"\tPUSH\tSS:[BP]\n");
		fprintf(inter_code,"\tPOP\tBP\n");
	}
}

void ixa_elem_size(void)
{
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tSHL\tAX , %d\n",EXP_VARIABLE_LENGTH);
	fprintf(inter_code,"\tADD\tAX , BX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void lab(char *label)
{
	fprintf(inter_code,"%s :\n",label);
}

void ldl(char value)
{
	fprintf(inter_code,"\tMOV\tAX , %d\n",(int)value);
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void lda(char *name)//载入地址
{
	int addr = 0;
	ValEntry * pEntry = malloc(sizeof(ValEntry));
	if(pTable ->nestlevel == 0){
		fprintf(inter_code,"\tLEA\tAX , %s\n",name);
		fprintf(inter_code,"\tPUSH\tAX\n");
	}
	else{
		Lookup_Var(pTable, pTable ->funEntry, name, pEntry);
		addr = pEntry->offset;
		fprintf(inter_code,"\tMOV\tAX , BP\n");
		fprintf(inter_code,"\tADD\tAX , %d\n",addr);
		fprintf(inter_code,"\tPUSH\tAX\n");
	}
}

void ldc(int value)//再入常数
{
	fprintf(inter_code,"\tMOV\tAX , %d\n",value);
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void less(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJL\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}

void lod(char *name)
{
	int addr = 0;
	ValEntry * pEntry = malloc(sizeof(ValEntry));
	Lookup_Var(pTable, pTable ->funEntry, name, pEntry);
	if(pTable ->nestlevel == 0){
		fprintf(inter_code,"\tMOV\tAX , %s\n",name);
		fprintf(inter_code,"\tPUSH\tAX\n");
	}
	else{
		Lookup_Var(pTable,pTable ->funEntry, name,pEntry);
		addr = pEntry ->offset;
		fprintf(inter_code,"\tPUSH\tBP\n");
		fprintf(inter_code,"\tADD\tBP , %d\n",addr);
		fprintf(inter_code,"\tMOV\tAX , SS:[BP]\n");
		fprintf(inter_code,"\tPOP\tBP\n");
		fprintf(inter_code,"\tPUSH\tAX\n");
	}
}

void lorei(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJLE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}

void mst(char *name)
{
}

void multi(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tPUSH\tDX\n");
	fprintf(inter_code,"\tIMUL\tBX\n");
	fprintf(inter_code,"\tPOP\tDX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void neqi(void)
{
	fprintf(inter_code,"\tPOP\tBX\n");

⌨️ 快捷键说明

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