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

📄 instructions.h

📁 模拟了tec2000的所有功能
💻 H
字号:
#pragma once
#include"DataBase.h"
#include"string.h"
#include"iostream.h"
class InsNode{             //指令节点类
	friend class InsList;  //指令链表类,各节点为上述指令节点类对象
private:
	char name[5];          //指令别名
	HexArray op;           //16进制链表类,可记录一16进制数
	int insLength;         //指令长度
	int paraNum;           //操作数个数
	int gramaSort;         //指令种类
	HexArray address;      //微址
	InsNode * NextNode;    //
	int CompareName(char *);
	int CompareName(InsNode *);
	int CompareOp(char *);
	int CompareOp(InsNode *);
public:   
	InsNode(char * n,char * o,int l,int p,int g,char * a)         //构造函数
		:op(2),insLength(l),paraNum(p),gramaSort(g),address(2){
		static int i;
		static char temp;
		i=0;
		do{temp=n[i];name[i]=temp;i++;}while(temp != '\0');
	    name[i]='\0';
		op.SetString(o);
		address.SetString(a);
		NextNode=NULL;
	  }
	
	int GetInsLength(){return insLength;}
	int GetGramaSort(){return gramaSort;}
	int GetParaNum(){return paraNum;}
	HexArray * GetOp(){return &op;}
	char * GetName(){return name;}
	void Disp();
};
int InsNode::CompareName(char * ch){        //比较指令名
	 if(strcmp(name,ch)==0)return 1;
	 else return -1;
}
int InsNode::CompareName(InsNode * ins){    //
	if(ins==NULL)return 0;
	return CompareName(ins->GetName());
}
int InsNode::CompareOp(char * opa){         //比较机器码
	static char * a;
	a=op.GetString();
	if(strcmp(a,opa)==0)return 1;
	return -1;
}
int InsNode::CompareOp(InsNode * ins){      //
	if(ins==NULL)return 0;
	return CompareOp(ins->GetOp()->GetString());
}
void InsNode::Disp(){                       //输出单个节点内容 
	cout << name << "\t" 
		 << op.GetString() << '\t' 
		 << insLength << '\t' 
		 << paraNum << '\t' 
		 << gramaSort << '\t' 
		 << address.GetString()
		 << endl;
}


class InsList{                           //指令节点链表类
private:
	InsNode * ListHead;                  //头节点
	void BuildBasicIns();                //基本指令
	void BuildExtendedIns();             //扩展指令 
public:
	InsList():ListHead(NULL){
		BuildBasicIns();
	    BuildExtendedIns();
	}
	void AddInsNode(char *,char *,int,int,int,char *);
	InsNode * SearchName(char *);
	InsNode * SearchOp(char *);
	void DispAllIns();
};
void InsList::AddInsNode(char * n,char * o,int l,int p,int g,char * a){ //加入指令到InsList
	InsNode * temp;
    temp=new InsNode(n,o,l,p,g,a);
	if(ListHead==NULL){ListHead=temp;}
	else{
			temp->NextNode=ListHead;
			ListHead=temp;
		}
}
void InsList::BuildBasicIns(){
	//-----Instructions----
	AddInsNode("PSHF","84",1,0,3,"00");//OP
	AddInsNode("POPF","8C",1,0,3,"00");
	AddInsNode("RET","8F",1,0,3,"00");
	//
	AddInsNode("DEC","08",1,1,23,"00");//OP DR
	AddInsNode("INC","09",1,1,23,"00");
	AddInsNode("SHL","0A",1,1,23,"00");
	AddInsNode("SHR","0B",1,1,23,"00");
	AddInsNode("POP","87",1,1,23,"00");
	//
	AddInsNode("PUSH","85",1,1,22,"00");//OP SR
	//
	AddInsNode("JR","41",1,1,5,"00");//OP OFFSET
	AddInsNode("JRC","44",1,1,5,"00");
	AddInsNode("JRNC","45",1,1,5,"00");
	AddInsNode("JRZ","46",1,1,5,"00");
	AddInsNode("JRNZ","47",1,1,5,"00");
	//
	AddInsNode("IN","82",1,1,21,"00");//OP BYTE(PORT)
	AddInsNode("OUT","86",1,1,21,"00");
	//
	AddInsNode("ADD","00",1,2,1,"00");//OP DR, SR
	AddInsNode("SUB","01",1,2,1,"00");
	AddInsNode("AND","02",1,2,1,"00");
	AddInsNode("CMP","03",1,2,1,"00");
	AddInsNode("XOR","04",1,2,1,"00");
	AddInsNode("TEST","05",1,2,1,"00");
	AddInsNode("OR","06",1,2,1,"00");
	AddInsNode("MVRR","07",1,2,1,"00");
	AddInsNode("LDRR","81",1,2,12,"00");//OP DR, [SR]
	AddInsNode("STRR","83",1,2,13,"00");//OP [DR], SR
	//
	AddInsNode("JMPA","80",2,1,6,"00");//OP ADDR(16)
	AddInsNode("CALA","CE",2,1,6,"00");
	//
	AddInsNode("MVRD","88",2,2,411,"00");//OP DR, DATA(16)
}
void InsList::BuildExtendedIns(){
	AddInsNode("CLC","6C",1,0,3,"00");//OP
	AddInsNode("STC","6D",1,0,3,"00");
	AddInsNode("EI","6E",1,0,3,"00");
	AddInsNode("DI","6F",1,0,3,"00");
	AddInsNode("IRET","EF",1,0,3,"00");
	//
	AddInsNode("RCL","2A",1,1,23,"00");//OP DR
	AddInsNode("RCR","2B",1,1,23,"00");
	AddInsNode("ASR","2C",1,1,23,"00");
	AddInsNode("NOT","2D",1,1,23,"00");
	//
	AddInsNode("JMPR","64",1,1,22,"00");//OP SR
	AddInsNode("CALR","E0",1,1,22,"00");
	//
	AddInsNode("JRS","65",1,1,5,"00");//OP OFFSET
	AddInsNode("JRNS","66",1,1,5,"00");
	//
	AddInsNode("ADC","20",1,2,1,"00");//OP DR,SR
	AddInsNode("SBB","21",1,2,1,"00");
	//
	AddInsNode("LDRA","E4",2,2,412,"00");//OP DR,[ADDR]
	AddInsNode("STRA","E7",2,2,413,"00");//OP [ADDR],SR
	//
	AddInsNode("LDRX","E5",2,2,42,"00");//OP DR, OFFSET[SR]
	AddInsNode("STRX","E6",2,2,42,"00");
	//-----Instructions----
}
InsNode * InsList::SearchName(char * n){   //在InsList中寻找对应指令名的节点
	static InsNode * ret;
	ret=ListHead;
	while(ret != NULL){
		if(ret->CompareName(n)==1)return ret;
		ret=ret->NextNode;
	}
	return NULL;
}
InsNode * InsList::SearchOp(char * o){     //在InsList中寻找对应机器码的节点
    static InsNode * ret;
	ret=ListHead;
	while(ret != NULL){
	if(ret->CompareOp(o)==1) return ret;
	ret=ret->NextNode;
	}
	return ret;
}
void InsList::DispAllIns(){                //输出全部指令内容
	static InsNode * temp;
	temp=ListHead;
	while(temp != NULL){temp->Disp();temp=temp->NextNode;}	
}

//----class InsList---- +

⌨️ 快捷键说明

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