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

📄 kernel.x

📁 一个用自己写的编译器编译的操作系统内核. 有包含中断和不包含中断两个版本. 还有简单的用户应用程序。 因为该代码原目的是下载到硬件上使用
💻 X
📖 第 1 页 / 共 2 页
字号:
//*******************************************************************
//output
void sys_putchar(char c)
{
	while (((*(int *)0x6001) & 1) == 0);  //check the state register of 8251, until the TxDRY = 1, then receive data from CPU
	*(int *)0x6000 = (int )c;    //transfer a char from CPU to 8251
}

void sys_puts(char *s)   //transfer a string from CPU to 8251
{
	int i;
	for (i=0;*(s+i)!=0;i++)
		sys_putchar(s[i]);
}

void sys_puthex(int num)   //change a dec number to hex form(actually made up of array of char), and transfer it
{
	int i,j;
	for (i=0;i<4;i++)
	{
		j = ((num & 0xF000) >> 12);
		num = (num << 4);
		if (j < 10)
			sys_putchar((char)(j+48));
		else sys_putchar((char)(j+55));
	}
}

//*******************************************************************
//input
char sys_getchar()   // get a char from 8251 to CPU
{
	char ch;
	while (((*(int *)0x6001) & 2) == 0);   //check if RxRDY = 1, then receive
	ch = (char)((*(int *)0x6000) & 0xFF);
	if (ch == (char)10)      // ch is "enter"(new line)
		sys_putchar(ch);
	return ch;
}

char sys_get8bit()
{
	char ch;
	while (((*(int *)0x6001) & 2) == 0);
	ch = (char)((*(int *)0x6000) & 0xFF);
	return ch;
}

int sys_gethex()
{
	int num;
	char ch;
	ch = sys_get8bit();
	num = (ch << 8);
	ch = sys_get8bit();
	num = (num | ch);
	return num;
}

//*******************************************************************
//decode

int *const_asm;
const int asm_total = 48;
int [6]Reg;

struct TASM
{
	char [6]name;
	int code;
	int x,y,z;
};


/*struct Tf
{
	int t;
	int hi;
	int lo;
	int sp;
	int ra;
	int [8]regs;
	int intno;
	int pc;
};

struct Env
{
	struct Tf tf;   //环境的“现场信息”
	int env_id;     //环境id
	int first_run;  //标记环境是否是个新环境(第一次执行)
};*/


int debug_mode;


//sys_command
void sys_command();
void uasm(int code);


const int ram_begin = 0x4000;
const int ram_end = 0x6000;



void init() 
{
  //初始化const_asm整数表
	const_asm = <			65,68,68,83,80,51,1793,63743,65280,65535,
							66,0,0,0,0,0,4096,63488,65535,65535,
							66,69,81,90,0,0,9984,63743,65280,65535,
							66,78,69,90,0,0,12032,63743,65280,65535,
							83,76,76,0,0,0,14308,63743,65311,65507,
							83,82,76,0,0,0,14310,63743,65311,65507,
							83,82,65,0,0,0,14311,63743,65311,65507,
							65,68,68,73,85,51,18400,63743,65311,65520,
							65,68,68,73,85,0,20224,63743,65280,65535,
							83,76,84,73,0,0,22272,63743,65280,65535,
							83,76,84,85,73,0,24321,63743,65280,65535,
							66,84,69,81,90,0,24576,65280,65535,65535,
							66,84,78,69,90,0,24832,65280,65535,65535,
							83,87,45,82,83,0,25089,65280,65535,65535,
							65,68,68,83,80,0,25344,65280,65535,65535,
							77,84,83,80,0,0,25824,65311,65535,65535,
							77,79,86,69,0,0,26599,65311,65528,65535,
							76,73,0,0,0,0,28417,63743,65280,65535,
							67,77,80,73,0,0,30465,63743,65280,65535,
							76,87,45,83,80,0,38657,63743,65280,65535,
							76,87,0,0,0,0,40929,63743,65311,65504,
							83,87,45,83,80,0,55041,63743,65280,65535,
							83,87,0,0,0,0,57313,63743,65311,65504,
							65,68,68,85,0,0,59389,63743,65311,65507,
							83,85,66,85,0,0,59391,63743,65311,65507,
							74,82,0,0,0,0,61184,63743,65535,65535,
							77,70,72,73,0,0,61200,63743,65535,65535,
							77,70,76,79,0,0,61202,63743,65535,65535,
							77,70,80,67,0,0,61248,63743,65535,65535,
							83,76,84,0,0,0,61410,63743,65311,65535,
							83,76,84,85,0,0,61411,63743,65311,65535,
							83,76,76,86,0,0,61412,63743,65311,65535,
							83,82,76,86,0,0,61414,63743,65311,65535,
							83,82,65,86,0,0,61415,63743,65311,65535,
							67,77,80,0,0,0,61418,63743,65311,65535,
							78,69,71,0,0,0,61419,63743,65311,65535,
							65,78,68,0,0,0,61420,63743,65311,65535,
							79,82,0,0,0,0,61421,63743,65311,65535,
							88,79,82,0,0,0,61422,63743,65311,65535,
							78,79,84,0,0,0,61423,63743,65311,65535,
							77,85,76,84,0,0,61432,63743,65311,65535,
							77,85,76,84,85,0,61433,63743,65311,65535,
							68,73,86,0,0,0,61434,63743,65311,65535,
							68,73,86,85,0,0,61435,63743,65311,65535,
							78,79,80,0,0,0,2048,65535,65535,65535,
							73,78,84,0,0,0,63489,65520,65535,65535,
							77,70,73,72,0,0,63232,63743,65535,65535,
							77,84,73,72,0,0,63233,63743,65535,65535
		>;

}

//*******************************************************************
//uasm
void uasm(int code)  //反汇编
{
	struct TASM *p;
	p = (struct TASM *)const_asm;
	int i, j, k;
	for (i=0;i<asm_total;i++)
	{
		j = ((*p).code & (*p).x & (*p).y & (*p).z); 
		k = (code & (*p).x & (*p).y & (*p).z);
		if (j == k)
			break;
		p ++;
	}
	sys_puts("  <");
	sys_puthex(code);
	sys_puts("> ");
	if (i == asm_total)
	{
		sys_puts(" --- UNKNOWN ---\n");
		return ;
	}
	char *name;
	name = (*p).name;
	for (i=0;i<6 && name[i]!=0;i++)
		sys_putchar(name[i]);
	int [3]regs;
	int num;
	regs[0] = ~(*p).x;
	regs[1] = ~(*p).y;
	regs[2] = ~(*p).z;
	for (i=0;i<3;i++)
	{
		if (regs[i] != 0)
		{
			k = (regs[i] & (*p).code);
			num = (regs[i] & code);
			if (regs[i] == k)
			{
				sys_puts(" R");
				while ((regs[i] & 1) == 0)
				{
					num = (num >> 1);
					regs[i] = (regs[i] >> 1);
				}
				sys_putchar((char)(num+48));
			}
			else if (k == 0)
			{
				sys_putchar(' ');
				while ((regs[i] & 1) == 0)
				{
					num = (num >> 1);
					regs[i] = (regs[i] >> 1);
				}
				j = ~regs[i];
				if ((num & (j >> 1)) != 0)
					num = (num | j);
				sys_puthex(num);
			}
			else
			{
				sys_putchar(' ');
				while ((regs[i] & 1) == 0)
				{
					num = (num >> 1);
					regs[i] = (regs[i] >> 1);
				}
				sys_puthex(num);
			}
		}
	}
	sys_putchar('\n');
}

int get_value(char *s,int *error)   //将一个以字符串形式表示的数(十六进制)转换成整数形式,空串或形式有误都会使error = 1
{
	if (s[0] == 0)
	{
		*error = 1;
		return 0xFFFF;
	}
	int i, value;
	value = 0;
	char ch;
	*error = 0;
	for (i=0;*(s+i)!=0;i++)
	{
		ch = s[i];
		value = (value << 4);
		if (ch<='9' && ch>='0')
			value = (value | (ch-'0'));
		else if (ch<='f' && ch>='a')
			value = (value | (ch-'W'));
		else if (ch<='F' && ch>='A')
			value = (value | (ch-'7'));
		else
		{
			*error = 1;
			return 0xFFFF;
		}
	}
	return value;
}

int strlen(char *s)
{
	int len;
	len = 0;
	while (s[len] != 0) len ++;
	return len;
}

int asm(int argc,char **argv)    //将MIPS指令转换为二进制编码
{
	int i, j, k, code, len, value, error;
	struct TASM *p;
	char *s;
	value = get_value(argv[0],&error);
	if (error == 0)
	{
		if (strlen(argv[0]) > 4)
		{
			return 0xFFFF;			
		}
		return value;
	}
	p = (struct TASM *)const_asm;
	for (i=0;i<asm_total;i++)
	{
		s = (*p).name;
		k = 0;
		while (k < 6 && s[k] != 0) k ++;
		if (k == strlen(argv[0]))
		{
			for (j=0;j<k;j++)
			{
				if (s[j] != argv[0][j] && (s[j]+32) != argv[0][j])
					break;
			}
			if (j == k)
				break ;
		}
		p ++;
	}
	if ((code = i) == asm_total)    //没有找到相应的指令,报错
	{
	  sys_puts("error 322");
		return 0xFFFF;
	}
	code = (*p).code;
	int [3]regs;
	regs[0] = ~(*p).x;

⌨️ 快捷键说明

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