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

📄 translater.cpp

📁 汇编语言的解释器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<string>
#include<iostream>
#include<stdio.h>
#include<stdio.h>
using namespace std;
//--------机器码长---------
#define MCodeLength 128
#define OpCodeLength 8
#define RelModeLength 2
#define ReservedLength 6
#define Src1RegLength 8
#define Src2RegLength 8
#define Src3RegLength 8
#define DstRegLength 8
#define Src1BankLength 3
#define Src2BankLength 3
#define Src3BankLength 3
#define DstBankLength 3
#define SwzSrc1Length 8
#define SwzSrc2Length 8
#define SwzSrc3Length 8
#define MaskLength 4
#define NegFSrc1Length 1
#define NegFSrc2Length 1
#define NegFSrc3Length 1
#define SatDestLength 1

//---------机器码起始位置----------
#define OpCodeBegin		120	
#define RelModeBegin	118
#define ReservedBegin	112
#define Src1RegBegin	104
#define Src2RegBegin	96
#define Src3RegBegin	88
#define DstRegBegin		80
#define Src1BankBegin	77
#define Src2BankBegin	73
#define Src3BankBegin	71
#define DstBankBegin	68
#define SwzSrc1Begin	60
#define SwzSrc2Begin	52
#define SwzSrc3Begin	44
#define MaskBegin		36
#define NegFSrc1Begin	35
#define NegFSrc2Begin	34
#define NegFSrc3Begin	33
#define SatDestBegin	32

//------------机器码更新数组-----------
int UpOpCode[OpCodeLength]		={0,0,0,0,0,0,0,0}; 
int	UpRelMode[RelModeLength]	={0,0};
int UpReserved[ReservedLength]	={0,0,0,0,0,0};
int UpSrc1Reg[Src1RegLength]	={0,0,0,0,0,0,0};
int UpSrc2Reg[Src2RegLength]	={0,0,0,0,0,0,0};
int UpSrc3Reg[Src3RegLength]	={0,0,0,0,0,0,0};
int UpDstReg[DstRegLength]		={0,0,0,0,0,0,0};
int UpSrc1Bank[Src1BankLength]	={0,0,0};
int UpSrc2Bank[Src2BankLength]	={0,0,0};
int UpSrc3Bank[Src3BankLength]	={0,0,0};
int UpDstBank[DstBankLength]	={0,0,0};
int UpSwzSrc1[SwzSrc1Length]	={0,0,0,0,0,0,0};
int UpSwzSrc2[SwzSrc2Length]	={0,0,0,0,0,0,0};
int UpSwzSrc3[SwzSrc3Length]	={0,0,0,0,0,0,0};
int UpMask[MaskLength]			={0,0,0,0};
int UpNegFSrc1[NegFSrc1Length]	={0};
int UpNegFSrc2[NegFSrc2Length]	={0};
int UpNegFSrc3[NegFSrc3Length]	={0};
int UpSatDest[SatDestLength]	={0};

int *SrcReg_P[3]	= {UpSrc1Reg, UpSrc2Reg, UpSrc3Reg};
int *SrcBank_P[3]	= {UpSrc1Bank, UpSrc2Bank, UpSrc3Bank};
int *SwzSrc_P[3]	= {UpSwzSrc1, UpSwzSrc2, UpSwzSrc3};
int *NegFSrc_P[3]	= {UpNegFSrc1, UpNegFSrc2, UpNegFSrc3};

static bool EXIT_FLAG		=false;
static bool NOTE_FLAG		=false;
static bool CODE_ERRO_FLAG	=false;
static bool SRC_ERRO_FLAG	=false;
static int Output[MCodeLength];
static int SrcNum;			//操作数数目
static int Begin; 
static int End;
static int AsmLength;
FILE *fpw,*fpr;

void Update(){
		int i;
		printf("OpCode:");
		for(i=0;i<OpCodeLength;i++){
			printf("%d",UpOpCode[i]);
			Output[i+OpCodeBegin]=Output[i+OpCodeBegin]|UpOpCode[i];
		}
		printf("\n");

		printf("RelMode:");
		for(i=0;i<RelModeLength;i++){
			printf("%d",UpRelMode[i]);
			Output[i+RelModeBegin]=Output[i+RelModeBegin]|UpRelMode[i];
		}
		printf("\n");
		
		printf("Reserved:");
		for(i=0;i<ReservedLength;i++){
			printf("%d",UpReserved[i]);
			Output[i+ReservedBegin]=Output[i+ReservedBegin]|UpReserved[i];
		}
		printf("\n");	

		printf("Src1Reg:");
		for(i=0;i<Src1RegLength;i++){
			printf("%d",UpSrc1Reg[i]);
			Output[i+Src1RegBegin]=Output[i+Src1RegBegin]|UpSrc1Reg[i];
		}
		printf("\n");

		printf("Src2Reg:");
		for(i=0;i<Src2RegLength;i++){
			printf("%d",UpSrc2Reg[i]);
			Output[i+Src2RegBegin]=Output[i+Src2RegBegin]|UpSrc2Reg[i];
		}
		printf("\n");

		printf("Src3Reg:");
		for(i=0;i<Src3RegLength;i++){
			printf("%d",UpSrc3Reg[i]);
			Output[i+Src3RegBegin]=Output[i+Src3RegBegin]|UpSrc3Reg[i];
		}
		printf("\n");

		printf("DstReg:");
		for(i=0;i<DstRegLength;i++){
			printf("%d",UpDstReg[i]);
			Output[i+DstRegBegin]=Output[i+DstRegBegin]|UpDstReg[i];
		}
		printf("\n");

		printf("Src1Bank:");
		for(i=0;i<Src1BankLength;i++){
			printf("%d",UpSrc1Bank[i]);
			Output[i+Src1BankBegin]=Output[i+Src1BankBegin]|UpSrc1Bank[i];
		}
		printf("\n");

		printf("Src2Bank:");
		for(i=0;i<Src2BankLength;i++){
			printf("%d",UpSrc2Bank[i]);
			Output[i+Src2BankBegin]=Output[i+Src2BankBegin]|UpSrc2Bank[i];
		}
		printf("\n");

		printf("Src3Bank:");
		for(i=0;i<Src3BankLength;i++){
			printf("%d",UpSrc3Bank[i]);
			Output[i+Src3BankBegin]=Output[i+Src3BankBegin]|UpSrc3Bank[i];
		}
		printf("\n");

		printf("DstBank:");
		for(i=0;i<DstBankLength;i++){
			printf("%d",UpDstBank[i]);
			Output[i+DstBankBegin]=Output[i+DstBankBegin]|UpDstBank[i];
		}
		printf("\n");

		printf("SwzSrc1:");
		for(i=0;i<SwzSrc1Length;i++){
			printf("%d",UpSwzSrc1[i]);
			Output[i+SwzSrc1Begin]=Output[i+SwzSrc1Begin]|UpSwzSrc1[i];
		}
		printf("\n");

		printf("SwzSrc2:");
		for(i=0;i<SwzSrc2Length;i++){
			printf("%d",UpSwzSrc2[i]);
			Output[i+SwzSrc2Begin]=Output[i+SwzSrc2Begin]|UpSwzSrc2[i];
		}
		printf("\n");

		printf("SwzSrc3:");
		for(i=0;i<SwzSrc3Length;i++){
			printf("%d",UpSwzSrc3[i]);
			Output[i+SwzSrc3Begin]=Output[i+SwzSrc3Begin]|UpSwzSrc3[i];
		}
		printf("\n");

		printf("Mask:");
		for(i=0;i<MaskLength;i++){
			printf("%d",UpMask[i]);
			Output[i+MaskBegin]=Output[i+MaskBegin]|UpMask[i];
		}
		printf("\n");

		printf("NegFSrc1:");
		for(i=0;i<NegFSrc1Length;i++){
			printf("%d",UpNegFSrc1[i]);
			Output[i+NegFSrc1Begin]=Output[i+NegFSrc1Begin]|UpNegFSrc1[i];
		}
		printf("\n");

		printf("NegFSrc2:");
		for(i=0;i<NegFSrc2Length;i++){
			printf("%d",UpNegFSrc2[i]);
			Output[i+NegFSrc2Begin]=Output[i+NegFSrc2Begin]|UpNegFSrc2[i];
		}
		printf("\n");

		printf("NegFSrc3:");
		for(i=0;i<NegFSrc3Length;i++){
			printf("%d",UpNegFSrc3[i]);
			Output[i+NegFSrc3Begin]=Output[i+NegFSrc3Begin]|UpNegFSrc3[i];
		}
		printf("\n");

		printf("SatDest:");
		for(i=0;i<SatDestLength;i++){
			printf("%d",UpSatDest[i]);
			Output[i+SatDestBegin]=Output[i+SatDestBegin]|UpSatDest[i];
		}
		printf("\n");
}

void InitUp(){
	int i;
//-----------初始化--------------
	for(i=0;i<OpCodeLength;i++){
		UpOpCode[i]=0;
	}
	for(i=0;i<RelModeLength;i++){
		UpRelMode[i]=0;
	}
	for(i=0;i<ReservedLength;i++){
		UpReserved[i]=0;
	}
	for(i=0;i<Src1RegLength;i++){
		UpSrc1Reg[i]=0;
	}
	for(i=0;i<Src2RegLength;i++){
		UpSrc2Reg[i]=0;
	}
	for(i=0;i<Src3RegLength;i++){
		UpSrc3Reg[i]=0;
	}
	for(i=0;i<DstRegLength;i++){
		UpDstReg[i]=0;
	}
	for(i=0;i<Src1BankLength;i++){
		UpSrc1Bank[i]=0;
	}
	for(i=0;i<Src2BankLength;i++){
		UpSrc2Bank[i]=0;
	}
	for(i=0;i<Src3BankLength;i++){
		UpSrc3Bank[i]=0;
	}
	for(i=0;i<DstBankLength;i++){
		UpDstBank[i]=0;
	}
	for(i=0;i<SwzSrc1Length;i++){
		UpSwzSrc1[i]=0;
	}
	for(i=0;i<SwzSrc2Length;i++){
		UpSwzSrc2[i]=0;
	}
	for(i=0;i<SwzSrc3Length;i++){
		UpSwzSrc3[i]=0;
	}
	for(i=0;i<MaskLength;i++){
		UpMask[i]=0;
	}
	for(i=0;i<NegFSrc1Length;i++){
		UpNegFSrc1[i]=0;
	}
	for(i=0;i<NegFSrc2Length;i++){
		UpNegFSrc2[i]=0;
	}
	for(i=0;i<NegFSrc3Length;i++){
		UpNegFSrc3[i]=0;
	}
	for(i=0;i<SatDestLength;i++){
		UpSatDest[i]=0;
	}
}

//---------------------字符串比较函数-----------
bool charcmp(char *a,char *b){
	int i=0;
	while(a[i]!='\0'||b[i]!='\0'){
		if(a[i]!=b[i])return false;
		i++;
	}
	return true;
}



//**********************************************

bool OutputMask(int *UpMask, int *Comma, int *Dot, char *Input)
{
	int XYZW_EXIST[4]={0,0,0,0};
	if (Dot[0] == 0)
		return false;
	if (Comma[1]-Dot[0]>5)
	{
	}
	return false;
}

//--------------源操作数的排列处理---------------
bool SwzSrc(int *UpSwzSrc, int *Comma, int *Dot, char *Input, int Pos)
{
	//Pos为源操作数的位数
	int XYZW_EXIST[4]={0,0,0,0};
	if (Dot[Pos] == 0)
	{
		UpSwzSrc[3]=1;
		UpSwzSrc[4]=1;
		UpSwzSrc[6]=1;
		UpSwzSrc[7]=1;
		return false;
	}
	if (Comma[Pos+1] - Dot[Pos] != 5)
	{
		return true;
	}
	else
	{
		int i = 0;
		for (i; i < 4; i++)
		{
			switch(Input[Dot[Pos] + i + 1])
			{
				case 'X':
					if(XYZW_EXIST[0])
						return true;					
					else
						XYZW_EXIST[0]=1;

					UpSwzSrc[1+2*i]=0;
					UpSwzSrc[2*i]=0;
					break;
				case 'Y':
					if(XYZW_EXIST[1])
						return true;					
					else
						XYZW_EXIST[1]=1;

					UpSwzSrc[1+2*i]=1;
					UpSwzSrc[2*i]=0;
					break;
				case 'Z':
					if(XYZW_EXIST[2])
						return true;					
					else
						XYZW_EXIST[2]=1;

					UpSwzSrc[1+2*i]=0;
					UpSwzSrc[2*i]=1;
					break;
				case 'W':
					if(XYZW_EXIST[3])
						return true;					
					else
						XYZW_EXIST[3]=1;

					UpSwzSrc[1+2*i]=1;
					UpSwzSrc[2*i]=1;
					break;
				default:
					return true;
			}
		}
	}
	return false;
}

//-----------------源操作数处理--------------------
bool Src(int SrcNum, int *Comma, int *Dot, char *Input)
{
	int CV_EXIST[2]={0,0};

	for (int i=1; i<=SrcNum; i++)
	{
		int Pos = Comma[i]+1;
		char Memory = Input[Pos];
		if(Memory == '-')
		{
			NegFSrc_P[i-1][0]=1;
			Pos++;
			Memory = Input[Pos];
		}
			
		int Address = 0;
		switch(Memory)
		{
			case 'V':
				if(CV_EXIST[1]==0)
					CV_EXIST[1]=1;
				else
					return true;
				if(Dot[i]!=0)
				{
					int length = Dot[i]-Pos-3; //[]内数字位数
					if (Input[Pos+1]!='[' || Input[Dot[i]-1]!=']' || length == 0 || length > 2)
						return true;
					else
					{
						if(length == 1)
							Address=Input[Dot[i]-2]-48;
						else
							Address=(Input[Dot[i]-2]-48)+(Input[Dot[i]-3]-48)*10;
					}
				}
				else
				{
					int length = Comma[i+1]-Pos-3; //[]内数字位数
					if (Input[Pos+1]!='[' || Input[Comma[i+1]-1]!=']' || length == 0 || length > 2)
						return true;
					else
					{
						if(length == 1)
							Address=Input[Comma[i+1]-2]-48;
						else
							Address=(Input[Comma[i+1]-2]-48)+(Input[Comma[i+1]-3]-48)*10;
					}

				}

⌨️ 快捷键说明

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