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

📄 wasm.cpp

📁 两条5级的并行流水线
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				err = numEncode(param.op1, &ins.op1, symbols);
				if(err) return err;
				imm = true;
			}
			else imm = false;

			if(imm)				//立即数
			{
				ins.op1 = ins.op1 - ipn;			//取偏移量
				
				if(ins.op1 & 0x3) return ADDRESS_NOT_ALIGN;
				ins.op1 = (long)ins.op1 >> 2;

				if(ins.op1 & 0xfc000000 && ~ins.op1 & 0xfe000000)
					return IMM_OUT_OF_RANGE;

				dwIns = ((ins.code|0x10)<<(32-6)) + (ins.op1 & 0x3ffffff);				
			}
			else									//寄存器
			{
				dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5-5-5));
			}
		}

		else if(ins.type == JU)						//sys->user
		{
			err = regEncode(param.op1, &ins.op1);
			if(err) return err;
			
			ins.op2 = 0x10;
			dwIns = (ins.code<<(32-6)) + (ins.op2<<(32-6-5)) + (ins.op1<<(32-6-5-5-5));
		}

		else if(ins.type == IRET)					//中断返回
		{
			ins.op1 = 0x08;
			dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5));
		}

		else if(ins.type == INT)					//中断, INT n
		{
			err = numEncode(param.op1, &ins.op1, symbols);
			if(err) return err;
			
			if(ins.op1 & 0xffffff00)						//n<256
				return IMM_OUT_OF_RANGE;

			ins.op2 = 0x04;
			dwIns = (ins.code<<(32-6)) + (ins.op2<<(32-6-5)) + (ins.op1 & 0xff);
		}

		else if(ins.type == STR)					//STORE、LOAD、立即数加载
		{
			if(!stricmp(param.code, "STR"))
			{
				err = regEncode(param.op1, &ins.op1);
				if(err) return err;
				err = regEncode(param.op2, &ins.op2);
				if(err) return err;

				dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5-5)) + (ins.op2<<(32-6-5-5-5));
			}

			if(!stricmp(param.code, "LDR"))
			{
				err = regEncode(param.op1, &ins.op1);
				if(err) return err;
				err = regEncode(param.op2, &ins.op2);
				if(err) return err;

				dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5)) + (ins.op2<<(32-6-5-5-5));
			}

			if(!stricmp(param.code, "LDA"))					//16位立即数装载
			{
				err = regEncode(param.op1, &ins.op1);
				if(err) return err;
				err = numEncode(param.op2, &ins.op2, symbols);
				if(err) return err;

				ins.op2 = ins.op2 & 0xffff;					//取低16位

				dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5)) + (ins.op1<<(32-6-5-5))
					+ ins.op2;								//R1 = R2
			}

			if(!stricmp(param.code, "LDA32"))				//移位并装载16位立即数
			{
				err = regEncode(param.op1, &ins.op1);
				if(err) return err;
				err = numEncode(param.op2, &ins.op2, symbols);
				if(err) return err;

				ins.op2 = ins.op2 & 0xffff;					//取低16位

				dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5)) + (ins.op1<<(32-6-5-5))
					+ ins.op2;								//R1 = R2
			}

		}

		pOut->write((char*)&dwIns, 4);

		ipn += 4;						//程序指针
	}
	return 0;							//成功


}


int getParam(char *str, Param *pParam)
{
	char string[1024];
	strcpy(string, str);

	char *e;
	e = strchr(string, ';');				//去除分号之后的注释
	if(e) *e = 0;

	int counter = 0;

	char *seps = " ,\t";							//分隔符
	char *tok;
	tok = strtok(string, seps);

	while(tok && counter<4)					//取出各参数字串
	{
		switch(counter)
		{
		case 0:
			strcpy(pParam->code,tok);
			break;
		case 1:
			strcpy(pParam->op1,tok);
			break;
		case 2:
			strcpy(pParam->op2,tok);
			break;
		case 3:
			strcpy(pParam->op3,tok);
			break;
		}
		++counter;

		tok = strtok(NULL,seps);
	}

	pParam->ops = counter-1;				//操作数数目

	if( tok && counter==4 )					//参数太多
	{
		return BAD_FORMAT;
	}

	if(counter == 0)						//空行
	{
		pParam->type = EMPTY;
		return 0;
	}

	e = pParam->code + strlen(pParam->code)-1;
	if( *e==':' )							//标号
	{
		pParam->type = LABEL;
		*e = 0;

		if(pParam->ops>0) return BAD_FORMAT;	//参数太多

		return 0;
	}

	if(!stricmp(pParam->code, "DD"))
	{
		pParam->type = DATA;					//数据
		if(pParam->ops!=1) return BAD_FORMAT;	//参数太多

		return 0;
	}

	int nBytes;
	if(nBytes = isMacro(pParam->code))			//伪指令
	{
		pParam->type = MACRO;
		pParam->ops = nBytes;					//指令总长

		return 0;
	}

	pParam->type = NORMAL;
	return 0;

}


int insEncode(char *str, unsigned long *pCode, int *type)
{
	if(!stricmp(str,"INIT"))
	{
		*pCode = 0x00;
		*type = MACRO;
		return 0;
	}

	if(!stricmp(str,"NOP"))
	{
		*pCode = 0x00;
		*type = NOP;
		return 0;
	}

	if(!stricmp(str,"MUL"))
	{
		*pCode = 0x0f;
		*type = MUL;
		return 0;
	}

	if(!stricmp(str,"ADD"))
	{
		*pCode = 0x20;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"SUB"))
	{
		*pCode = 0x21;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"AND"))
	{
		*pCode = 0x28;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"OR"))
	{
		*pCode = 0x29;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"XOR"))
	{
		*pCode = 0x2a;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"NOT"))
	{
		*pCode = 0x2b;
		*type = NOT;
		return 0;
	}

	if(!stricmp(str,"SHL"))
	{
		*pCode = 0x2c;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"SHR"))
	{
		*pCode = 0x2d;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"ASR"))
	{
		*pCode = 0x2e;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"ROR"))
	{
		*pCode = 0x2f;
		*type = ADD;
		return 0;
	}

	if(!stricmp(str,"CMP"))
	{
		*pCode = 0x01;
		*type = CMP;
		return 0;
	}

	if(!stricmp(str,"TST"))
	{
		*pCode = 0x08;
		*type = CMP;
		return 0;
	}

	if(!stricmp(str,"LDR"))
	{
		*pCode = 0x0a;
		*type = STR;
		return 0;
	}

	if(!stricmp(str,"STR"))
	{
		*pCode = 0x0b;
		*type = STR;
		return 0;
	}

	if(!stricmp(str,"LDA"))
	{
		*pCode = 0x1c;
		*type = STR;
		return 0;
	}

	if(!stricmp(str,"LDA32"))
	{
		*pCode = 0x1d;
		*type = STR;
		return 0;
	}

	if(!stricmp(str,"JMP"))
	{
		*pCode = 0x02;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"JU"))
	{
		*pCode = 0x02;
		*type = JU;
		return 0;
	}

	if(!stricmp(str,"INT"))
	{
		*pCode = 0x02;
		*type = INT;
		return 0;
	}

	if(!stricmp(str,"IRET"))
	{
		*pCode = 0x02;
		*type = IRET;
		return 0;
	}

	if(!stricmp(str,"JEQ"))
	{
		*pCode = 0x03;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"JNE"))
	{
		*pCode = 0x04;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"JHE"))
	{
		*pCode = 0x05;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"JLO"))
	{
		*pCode = 0x06;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"JGE"))
	{
		*pCode = 0x07;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"JLT"))
	{
		*pCode = 0x09;
		*type = JMP;
		return 0;
	}

	if(!stricmp(str,"MOV"))
	{
		*pCode = 0x0e;
		*type = MOV;
		return 0;
	}
	
	*pCode = 0;						//没有命中
	*type = UNDEFINED;

	return UNDEFINED_INSTRUCTION;
}

int regEncode(char *str, unsigned long *pCode)
{
	if(*str!='r' && *str!='R') return UNDEFINED_REGISTER;

	int num;
	num = atoi(str+1);

	if(num<0 || num>31) return UNDEFINED_REGISTER;

	*pCode = num;

	return 0;
}

int numEncode(char *str, unsigned long *value, list<Symbol> &symbols)
{
	if(*str>='0' && *str<='9' || *str == '-')
	{
		*value = strtol(str,0,0);
		return 0;
	}
	else
	{
		list<Symbol>::iterator it;
		for(it=symbols.begin(); it!=symbols.end(); ++it)
		{
			if(!stricmp(str,it->name))
			{
				*value = it->value;
				return 0;
			}
		}
	}

	return UNDEFINED_SYMBOL;
}


int isMacro(char *str)
{
	if(!stricmp(str,"INIT"))				//载入32位立即数
	{
		return 8;
	}

	return 0;
}

⌨️ 快捷键说明

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