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

📄 ls_instruction.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					u32 index;
					get_cpu()->read_register(rm_index,index);
					this->shft_rm(binary,index);
					get_cpu()->write_register(rn_index,rn_data - index);
				}
			}
			return ;		
		}
		if(u_3 == 5 && u_1 == 0)//10
		{
			//addr = rn 
			//if(cond)
			//rn = rn + rm or rn = rn + rm shift imm
			addr = rn_data;
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);
				if(bits.convert_to_int(4,11) == 0)
					get_cpu()->write_register(rn_index,rn_data + rm_data);
				else
				{
					//shift rm here
					u32 index;
					get_cpu()->read_register(rm_index,index);
					this->shft_rm(binary,index);
					get_cpu()->write_register(rn_index,rn_data + index);
				}
			}
			return ;
		}
	}

	void LS_Instruction::get_sh_address(Core::Instruction_Unit & binary,u32 & addr)
	{
		Core::Binary_32Bit bits(binary);
		u32 rn_index = bits.convert_to_int(16,19);
		u32 rn_data;
		get_cpu()->read_register(rn_index,rn_data);	
		switch(bits.convert_to_int(21,24))
		{
		case 14:
			{
				u32 immed_H,immed_L,offset_8;;
				immed_L = bits.convert_to_int(0,3);
				immed_H = bits.convert_to_int(8,11);
				offset_8 = immed_H << 4 | immed_L;
				addr = rn_data + offset_8;;
				if(rn_index == 15)
					addr = addr + 4;
				return;
			}
		case 10:
			{
				u32 immed_H,immed_L,offset_8;;
				immed_L = bits.convert_to_int(0,3);
				immed_H = bits.convert_to_int(8,11);
				offset_8 = immed_H << 4 | immed_L;
				addr = rn_data - offset_8;;
				if(rn_index == 15)
					addr = addr + 4;
				return;
			}
		case 12:
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);	
				addr = rn_data + rm_data;
				if(rn_index == 15)
					addr = addr + 4;
				return;
			}
		case 8:
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);	
				addr = rn_data - rm_data;
				if(rn_index == 15)
					addr = addr + 4;
				return;
			}
		case 15:
			{
				u32 immed_H,immed_L,offset_8;;
				immed_L = bits.convert_to_int(0,3);
				immed_H = bits.convert_to_int(8,11);
				offset_8 = immed_H << 4 | immed_L;
				addr = rn_data + offset_8;
				get_cpu()->write_register(rn_index,addr);
				return ;
			}
		case 11:
			{
				u32 immed_H,immed_L,offset_8;;
				immed_L = bits.convert_to_int(0,3);
				immed_H = bits.convert_to_int(8,11);
				offset_8 = immed_H << 4 | immed_L;
				addr = rn_data - offset_8;
				get_cpu()->write_register(rn_index,addr);
				return ;
			}
		case 13:
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);	
				addr = rn_data + rm_data;
				get_cpu()->write_register(rn_index,addr);
				return;
			}
		case 9:
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);	
				addr = rn_data - rm_data;
				get_cpu()->write_register(rn_index,addr);
				return;
			}
		case 6:
			{
				addr = rn_data;
				u32 immed_H,immed_L,offset_8;;
				immed_L = bits.convert_to_int(0,3);
				immed_H = bits.convert_to_int(8,11);
				offset_8 = immed_H << 4 | immed_L;
				{
					get_cpu()->write_register(rn_index,rn_data + offset_8);
				}
				return ;
			}
		case 2:
			{
				addr = rn_data;
				u32 immed_H,immed_L,offset_8;;
				immed_L = bits.convert_to_int(0,3);
				immed_H = bits.convert_to_int(8,11);
				offset_8 = immed_H << 4 | immed_L;
				{
					get_cpu()->write_register(rn_index,rn_data - offset_8);
				}
				return ;
			}
		case 4:
			{
				addr = rn_data;
				{
					u32 rm_index = bits.convert_to_int(0,3);
					u32 rm_data;
					get_cpu()->read_register(rm_index,rm_data);	
					get_cpu()->write_register(rn_index,rn_data + rm_data);
				}
				return;
			}
		case 0:
			{
				addr = rn_data;
				{
					u32 rm_index = bits.convert_to_int(0,3);
					u32 rm_data;
					get_cpu()->read_register(rm_index,rm_data);	
					get_cpu()->write_register(rn_index,rn_data - rm_data);
				}
				return;
			}
		}
	}

	void LS_Instruction::shft_rm(Core::Instruction_Unit & binary,u32 & index)
	{
		Core::Binary_32Bit bits(binary);
		u32 shift_imm = bits.convert_to_int(7,11);
		switch(bits.convert_to_int(5,6))
		{

		case 0://0
			{
				//LSL
				this->logical_left(index,shift_imm);
				return ;
			}
		case 1://1
			{
				//LSR
				if(shift_imm == 0)
					index = 0;
				else
					this->logical_right(index,shift_imm);
				return;
			}
		case 2://2
			{
				//ASR
				if(shift_imm == 0)
				{
					Core::Binary_32Bit test(index);
					if(test.get(31))
						index = 0xffffffff;
					else
						index = 0;
				}
				else
					this->arithmetic_right(index,shift_imm);
				return ;
			}
		case 3://3
			{
				//ROR or RRX
				if(shift_imm == 0)
					this->rotate_right_extend(index,shift_imm);
				else
					this->rotate_right(index,shift_imm);
				return ;
			}
		}
	}
	/*
	void LS_Instruction::bit_num(u32 & num,Core::Instruction_Unit & binary,u32 start,u32 end)
	{
	u32 i;
	Core::Binary_32Bit bits(binary);
	for(i = start;i<=end;i++)
	{
	if(bits.get(i))
	num++;
	}
	}

	u32 LS_Instruction::multi_address(Core::Instruction_Unit & binary,u32 & start_address,u32 & end_address)
	{
	Core::Binary_32Bit bits(binary);
	u32 rn_index = bits.convert_to_int(16,19);
	u32 num = 0;
	this->bit_num(num,binary,0,15);
	u32 rn_data = get_cpu()->read_register(rn_index);
	switch(bits.convert_to_int(23,24))
	{
	case 1://1
	{
	//IA
	start_address = rn_data;
	end_address = start_address + num * 4 - 4;
	if(bits.get(21))
	get_cpu()->write_register(rn_index,rn_data + num * 4);
	start_address = start_address & 0xfffffffc;
	end_address = end_address & 0xfffffffc;
	return rn_data;
	}
	case 3://3
	{
	//IB
	start_address = rn_data + 4;
	end_address = start_address - 4 + num * 4;//end_address = rn + num * 4
	if(bits.get(21))
	get_cpu()->write_register(rn_index,rn_data + num * 4);
	start_address = start_address & 0xfffffffc;
	end_address = end_address & 0xfffffffc;
	return rn_data;
	}
	case 0://0
	{
	//DA
	end_address = rn_data;
	start_address = end_address + 4 - num * 4;
	if(bits.get(21))
	get_cpu()->write_register(rn_index,start_address - 4);
	start_address = start_address & 0xfffffffc;
	end_address = end_address & 0xfffffffc;
	return rn_data;
	}
	case 2://2
	{
	//DB
	end_address = rn_data - 4;
	start_address = end_address + 4 - num * 4;
	if(bits.get(21))
	get_cpu()->write_register(rn_index,end_address + 4 - num * 4);
	start_address = start_address & 0xfffffffc;
	end_address = end_address & 0xfffffffc;
	return rn_data;
	}
	}
	*/
	void LS_Instruction::get_usermode_address(Core::Instruction_Unit & binary,u32 & addr)
	{
		//need func for usemode
		u32 offset_12;
		Core::Binary_32Bit bits(binary);
		u32 rn_index = bits.convert_to_int(16,19);
		u32 extra;
		u32 rn_data;
		get_cpu()->read_user_register(rn_index,rn_data);
		if(rn_index == 15)
			extra = 4;
		else
			extra = 0;
		u32 u_3 = bits.convert_to_int(23,25);
		u32 u_1 = bits.get(21);
		if(u_3 == 1 && u_1 == 1)//3
		{
			//addr = rn
			//if(cond)
			//rn = rn + offset_12
			addr = rn_data;
			{
				offset_12 = bits.convert_to_int(0,11);
				get_cpu()->write_user_register(rn_index,rn_data + offset_12);
			}
			return ;
		}
		if(u_3 == 0 && u_1 == 1)//1
		{
			//addr = rn
			//if(cond)
			//rn = rn -offset_12
			addr = rn_data;
			{
				offset_12 = bits.convert_to_int(0,11);
				get_cpu()->write_user_register(rn_index,rn_data - offset_12);
			}
			return ;
		}
		if(u_3 == 4 && u_1 == 1)//9
		{	
			//addr = rn
			//if(cond)
			//rn = rn - rm or rn = rn - rm shift imm
			addr = rn_data;
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_user_register(rm_index,rm_data);
				if(bits.convert_to_int(4,11) == 0)
					get_cpu()->write_user_register(rn_index,rn_data - rm_data);
				else
				{
					//shift rm here
					//	rm_index = this->BITS(instr,0,3);
					//	Register_32bit & rm = this->get_register(rm_index);
					u32 index = rm_data;
					this->shft_rm(binary,index);
					get_cpu()->write_user_register(rn_index,rn_data - index);
				}
			}
			return ;		
		}
		if(u_3 == 5 && u_1 == 1)//11
		{
			//addr = rn 
			//if(cond)
			//rn = rn + rm or rn = rn + rm shift imm
			addr = rn_data;
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_user_register(rm_index,rm_data);
				if(bits.convert_to_int(4,11) == 0)
					get_cpu()->write_user_register(rn_index,rn_data + rm_data);
				else
				{
					//shift rm here
					u32 index = rm_data;
					this->shft_rm(binary,index);
					get_cpu()->write_user_register(rn_index,rn_data - index);
				}
			}
			return ;
		}
	}
}




⌨️ 快捷键说明

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