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

📄 assembler.h

📁 MIPS32指令系统的汇编器。 在QUARTUS仿真环境中
💻 H
字号:
#ifndef ASSEMBLER_H
#define ASSEMBLER_H

#include "structs.h"
#include "errors.h"

#include <string>
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <list>
#include <stack>
#include <cmath>

using namespace std;

class Assembler
{
public:
	Assembler();
	~Assembler();

	void Parser( FILE* SourceFileName );

	int SyntacticAnalysis( FILE* SourceFileName );
	int Scanner( int, FILE* );
	int Deduction( int );
	char ReadOneChar( FILE* SourceFileName );	//读取下一个不是空白符或制表符的字符
	void InitTwoTables();
	void InitRegsAlias();
	void GenFiles();
	void ShutFiles();

	int WriteProg();   //将指令写入程序文件
	int AddNormalSegID();//如果最近采用的是27号产生式,则IDNAME是指令标号,顺序保存到标号表SEGID
										//如果标号有重复则错误退出, return 21;否则正确退出,return 0;
	int AddStartSegID();	//如果最近采用的是15号产生式,则IDNAME是起始指令标号,保存到标号表SEGID的最前面
										//如果标号有重复则错误退出, return 21;否则正确退出,return 0;
	int ConstructCMD();	// 将当前单词翻译为二进制码,存入CMD,如果翻译失败则return 10;退出
	int ConstructCOMMANDS();	//将CMD按照指令顺序保存到指令链COMMANDS,如果失败则return 10;退出
	int StoreVar();		//将变量标识符保存到VAR,如果失败则return 23;退出
	int AddBackID(); //将待回填的标号保存起来,保存到BACKTABLE中
	int BackWrite();	//在WriteProg()中首先调用该回填函数,完成指令,再写程序文件


	char* DecToBin(int);	//将0~31转化为二进制填入一个5bits的字符串中
	char* HexToBin(char);	//将一位十六进制数转化为二进制填入一个4bits的字符串中
	int AddrToInt(char*);	//将由四位十六进制的ADDR转化为十进制,使得用ORG设置指令(数据)地址时方便
	int SegNameToAddr(char*);  //由SEGID的名称来取出其地址
	int VarNameToAddr(char*);  //由VAR的名称来取出其地址
	bool StrCmp(char*, char*);	//比较两个字符串,如果相同则返回true,否则返回false

	void ErrorProcess(int);	//翻译错误处理
	void ErrorLex();	//词法错误处理,注意当前的TOKEN就是出错的地方,这可以用No_TxtLine来标识
	void DeleteFiles();	//程序不成功,就把已建的两个.mif文件删除掉
						
private:	
	// 预测分析表
	int ForcastTable[CountOfVN][CountOfVT];
	//语法规则表
	int SyntacticRules[NumOfRule][DepthOfRule];
	//寄存器编号与别名对应表
	char* RegsAlias[32][2];

	FILE* DataFile;
	FILE* ProgramFile;

	My_Token TOKEN;
	list<My_Var> VAR;
	list<My_SegID> SEGID;
	list<My_CMD> COMMANDS;
	list<My_Back> BACKTABLE;
	stack<int> STACK;

	int No_Com;		//指令行编号
	int No_Var;		//变量行编号
	char CMD[32];	//暂存指令,32位
//	int rv;	//Scanner的返回值,作为ErrorLex的入口参数	改为:	直接用STACK.top()作为ErrorLex的入口参数

	int No_TxtLine;	//输入文件(汇编源程序)的行号,主要用于识错时

	bool CodeUnitUsed[RamSize];
	bool DataUnitUsed[RamSize];		// 这两个用来指示哪些代码(或数据)单元已被占用,false表示未被占用,true表示已被占用

};

#endif

⌨️ 快捷键说明

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