📄 instructions.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 + -