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

📄 pi.x

📁 一个用自己写的编译器编译的操作系统内核. 有包含中断和不包含中断两个版本. 还有简单的用户应用程序。 因为该代码原目的是下载到硬件上使用
💻 X
字号:
const int LimitN = 1000;

void sys_putchar(char c)
{
	%asm {
		%writereg("r2", c);
		%asm("LI", "r0", "1");
		%asm("INT", "3");
		%asm("BNEZ", "r1", "-2");
		%asm("NOP");
	};
}

void puts(char *s)
{
	int i;
	for (i=0;*(s+i)!=0;i++)
		sys_putchar(s[i]);
}

void puthex(int num)
{
	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));
	}
}

int sys_getchar()
{
	int ret;
	%asm {
		%asm("LI", "r0", "2");
		%asm("INT", "3");
		%asm("BNEZ", "r1", "-2");
		%asm("NOP");
		%readreg("r2", ret);
	};
	sys_putchar((char) ret);
	return ret;
}

int getdec()
{
	char ch;
	while ((ch = (char)sys_getchar()) <= 32);
	int ret; ret = 0;
	while (ch >= '0' && ch <= '9')
	{
		ret = (ret << 3) + (ret << 1) + (int)ch - 48;
		ch = (char)sys_getchar();
	}
	return ret;
}

int mul(int a, int b)
{
	int ret;
	%asm {
		%asm("LW", "r7", "r0", "3");
		%asm("LW", "r7", "r1", "4");
		%asm("LI", "r2", "0");
		%asm("LI", "r3", "1");

		%asm("BEQZ", "r1", "8");
		%asm("MOVE", "r6", "r1");
		%asm("AND", "r6", "r3");
		%asm("BEQZ", "r6", "2");
		%asm("SRL", "r1", "r1", "1");
		%asm("ADDU", "r2", "r0", "r2");
		%asm("SLL", "r0", "r0", "1");
		%asm("BNEZ", "r1", "-6");
		%asm("MOVE", "r6", "r1");

		%readreg("r2", ret);
	};
	return ret;
}

int div(int a, int b, int* mod)
{
	int ret;
	%asm {
		%asm("LW", "r7", "r0", "3");
		%asm("LW", "r7", "r1", "4");
		%asm("LI", "r2", "0");
		%asm("LI", "r3", "1");
		%asm("LI", "r4", "1");
		%asm("LI", "r5", "0");
		%asm("SLL", "r1", "r1", "1");
		%asm("SLTU", "r1", "r0");
		%asm("BTNEZ", "-3");
		%asm("SLL", "r3", "r3", "1");
		
		%asm("SLTU", "r0", "r1");
		%asm("BTNEZ", "3");
		%asm("NOP");
		%asm("ADDU", "r2", "r3", "r2");
		%asm("SUBU", "r0", "r1", "r0");
		%asm("SRL", "r3", "r3", "1");
		%asm("SRL", "r1", "r1", "1");
		%asm("BNEZ", "r3", "-7");
		%asm("SLTU", "r0", "r1");

		%asm("LW", "r7", "r5", "5");
		%asm("SW", "r5", "r0", "0");

		%readreg("r2", ret);
	};
	return ret;
}

int[LimitN + 1] a, result;

int N;

int main() 
{
//	*(int *)0x6001 = 0x4E;
//	*(int *)0x6001 = 0x37;

	int i;	int j;	int k;	int q;
	int digit;
	int last;
	int ten;
	
	ten = 10;		// to speed up
	
	// initialize the buffer (to perform i!/(2i+1)!! and convolution).
	
	puts("N = "); N = getdec();
	for (i = 0; i <= N; i = i + 1)
		a[i] = 2;

	puts("Please wait while I am computing (about 3 seconds)...\n");
	
	// now we calculate
	last = 0;
	q = 0;
	for (j = N; j > 0; j = j - 1) {
		digit = 0;
		for (i = j; i > 0; i = i - 1) {
			digit = mul(i, digit) + (a[i] << 3) + (a[i] << 1);
			k = i + i - 1;
			digit = div(digit, k, &(a[i]));
		}
		int tmp;
		div(last + div(digit, ten, &tmp), ten, &(result[q]));
		sys_putchar((char)(result[q] + 48));
		if (q == 0)
		{
			sys_putchar('.');
		}
		q = q + 1;
		div(digit, ten, &last);
	}

	sys_putchar('\n');
//	while (1);
	return 0;
}

⌨️ 快捷键说明

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