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

📄 finsh_ops.c.svn-base

📁 RT-Thread是发展中的下一代微内核嵌入式实时操作系统
💻 SVN-BASE
字号:
#include "finsh_ops.h"#include "finsh_vm.h"#define OP_BIN_BYTE(x)  do {\        (finsh_sp - 2)->char_value = (finsh_sp - 2)->char_value x (finsh_sp - 1)->char_value; \        finsh_sp--; \    }while (0)#define OP_BIN_WORD(x)  do {\        (finsh_sp - 2)->short_value = (finsh_sp - 2)->short_value x (finsh_sp - 1)->short_value; \        finsh_sp--; \    }while (0)#define OP_BIN_DWORD(x)  do {\        (finsh_sp - 2)->long_value = (finsh_sp - 2)->long_value x (finsh_sp - 1)->long_value; \        finsh_sp--; \    }while (0)/* --- noop --- */void OP_no_op(){	/* none */	return ;}/* --- add --- */void OP_add_byte(){    OP_BIN_BYTE(+);	return ;}void OP_add_word(){    OP_BIN_WORD(+);	return ;}void OP_add_dword(){    OP_BIN_DWORD(+);	return ;}/* --- sub --- */void OP_sub_byte(){	OP_BIN_BYTE(-);	return ;}void OP_sub_word(){	OP_BIN_WORD(-);	return ;}void OP_sub_dword(){	OP_BIN_DWORD(-);	return ;}/* --- div --- */void OP_div_byte(){	OP_BIN_BYTE(/);	return ;}void OP_div_word(){	OP_BIN_WORD(/);	return ;}void OP_div_dword(){	OP_BIN_DWORD(/);	return ;}/* --- mod --- */void OP_mod_byte(){	OP_BIN_BYTE(%);	return ;}void OP_mod_word(){	OP_BIN_WORD(%);	return ;}void OP_mod_dword(){	OP_BIN_DWORD(%);	return ;}/* --- mul --- */void OP_mul_byte(){    OP_BIN_BYTE(*);	return ;}void OP_mul_word(){	OP_BIN_WORD(*);	return ;}void OP_mul_dword(){	OP_BIN_DWORD(*);	return ;}/* --- and --- */void OP_and_byte(){	OP_BIN_BYTE(&);	return ;}void OP_and_word(){	OP_BIN_WORD(&);	return ;}void OP_and_dword(){	OP_BIN_DWORD(&);	return ;}/* --- or --- */void OP_or_byte(){	OP_BIN_BYTE(|);	return ;}void OP_or_word(){	OP_BIN_WORD(|);	return ;}void OP_or_dword(){	OP_BIN_DWORD(|);	return ;}/* --- xor --- */void OP_xor_byte(){	OP_BIN_BYTE(^);	return ;}void OP_xor_word(){	OP_BIN_WORD(^);	return ;}void OP_xor_dword(){	OP_BIN_DWORD(^);	return ;}/* --- bw --- */void OP_bw_byte(){	(finsh_sp - 1)->char_value = ~ ((finsh_sp - 1)->char_value);	return ;}void OP_bw_word(){	(finsh_sp - 1)->short_value = ~ ((finsh_sp - 1)->short_value);	return ;}void OP_bw_dword(){	(finsh_sp - 1)->long_value = ~ ((finsh_sp - 1)->long_value);	return ;}/* --- shl --- */void OP_shl_byte(){	OP_BIN_BYTE(<<);	return ;}void OP_shl_word(){	OP_BIN_WORD(<<);	return ;}void OP_shl_dword(){	OP_BIN_DWORD(<<);	return ;}/* --- shr --- */void OP_shr_byte(){	OP_BIN_BYTE(>>);	return ;}void OP_shr_word(){	OP_BIN_WORD(>>);	return ;}void OP_shr_dword(){	OP_BIN_DWORD(>>);	return ;}/* --- ld --- */void OP_ld_byte(){	finsh_sp->char_value = *finsh_pc;	finsh_sp++;	finsh_pc++;	return ;}void OP_ld_word(){	finsh_sp->short_value = FINSH_GET16(finsh_pc);	finsh_sp ++;	finsh_pc += 2;	return ;}void OP_ld_dword(){	finsh_sp->long_value = FINSH_GET32(finsh_pc);	finsh_sp ++;	finsh_pc += 4;	return ;}void OP_ld_value_byte(){	char* c;	c = (char*) (FINSH_GET32(finsh_pc));	finsh_sp->char_value = *c;	finsh_sp ++;	finsh_pc += 4;	return;}void OP_ld_value_byte_stack(){	char* c;	c = (char *)(finsh_sp - 1)->long_value;	(finsh_sp - 1)->char_value = *c;	return;}void OP_ld_value_word(){	short* s;	s = (short*) (FINSH_GET32(finsh_pc));	finsh_sp->short_value = *s;	finsh_sp ++;	finsh_pc += 4;	return;}void OP_ld_value_word_stack(){	short* s;	s = (short *)(finsh_sp - 1)->long_value;	(finsh_sp - 1)->short_value = *s;	return;}void OP_ld_value_dword(){	long* l;	l = (long*) (FINSH_GET32(finsh_pc));	finsh_sp->long_value = *l;	finsh_sp ++;	finsh_pc += 4;	return;}void OP_ld_value_dword_stack(){	long* l;	l = (long *)(finsh_sp - 1)->long_value;	(finsh_sp - 1)->long_value = *l;	return;}/* --- st --- *//* * 2006-4-16 bernard * fixed the sp move bug */void OP_st_byte(){	*(char*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->char_value;	finsh_sp --;	return ;}/* * 2006-4-16 bernard * fixed the sp move bug */void OP_st_word(){	*(short*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->short_value;	finsh_sp --;	return ;}/* * 2006-4-16 bernard * fixed the sp move bug */void OP_st_dword(){	*(long*)((finsh_sp - 2)->long_value) = (finsh_sp - 1)->long_value;	finsh_sp --;	return ;}/* --- pop --- */void OP_pop(){	finsh_sp --;	return ;}/* --- call --- */void OP_call(){	/* the max number of arg*/	unsigned long parameterv[16];	unsigned int  parameters, i;	typedef unsigned long var_t;	typedef var_t (*op_func)();	op_func f;	var_t   r;	parameters = *finsh_pc ++;	i = 0; finsh_sp --;	while (i < parameters)	{		parameterv[parameters - 1 - i] = finsh_sp->long_value;		finsh_sp --;		i++;	}	f = (op_func)(finsh_sp->long_value);	switch (parameters)	{	case 0:		r = f();		break;	case 1:		r = f(parameterv[0]);		break;	case 2:		r = f(parameterv[0], parameterv[1]);		break;	case 3:		r = f(parameterv[0], parameterv[1], parameterv[2]);		break;	case 4:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3]);		break;	case 5:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4]);		break;	case 6:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5]);		break;	case 7:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6]);		break;	case 8:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7]);		break;	case 9:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8]);		break;	case 10:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9]);		break;	case 11:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9], parameterv[10]);		break;	case 12:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9], parameterv[10], parameterv[11]);		break;	case 13:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9], parameterv[10], parameterv[11],				parameterv[12]);		break;	case 14:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9], parameterv[10], parameterv[11],				parameterv[12], parameterv[13]);		break;	case 15:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9], parameterv[10], parameterv[11],				parameterv[12], parameterv[13], parameterv[14]);		break;	case 16:		r = f(parameterv[0], parameterv[1], parameterv[2], parameterv[3],				parameterv[4], parameterv[5], parameterv[6], parameterv[7],				parameterv[8], parameterv[9], parameterv[10], parameterv[11],				parameterv[12], parameterv[13], parameterv[14], parameterv[15]);		break;	default:		r = 0;		break;	}	finsh_sp->long_value = r;	finsh_sp ++;	return ;}op_func op_table[] ={	/* 00 */ OP_no_op,	/* 01 */ OP_add_byte,	/* 02 */ OP_add_word,	/* 03 */ OP_add_dword,	/* 04 */ OP_sub_byte,	/* 05 */ OP_sub_word,	/* 06 */ OP_sub_dword,	/* 07 */ OP_div_byte,	/* 08 */ OP_div_word,	/* 09 */ OP_div_dword,	/* 10 */ OP_mod_byte,	/* 11 */ OP_mod_word,	/* 12 */ OP_mod_dword,	/* 13 */ OP_mul_byte,	/* 14 */ OP_mul_word,	/* 15 */ OP_mul_dword,	/* 16 */ OP_and_byte,	/* 17 */ OP_and_word,	/* 18 */ OP_and_dword,	/* 19 */ OP_or_byte,	/* 20 */ OP_or_word,	/* 21 */ OP_or_dword,	/* 22 */ OP_xor_byte,	/* 23 */ OP_xor_word,	/* 24 */ OP_xor_dword,	/* 25 */ OP_bw_byte,	/* 26 */ OP_bw_word,	/* 27 */ OP_bw_dword,	/* 28 */ OP_shl_byte,	/* 29 */ OP_shl_word,	/* 30 */ OP_shl_dword,	/* 31 */ OP_shr_byte,	/* 32 */ OP_shr_word,	/* 33 */ OP_shr_dword,	/* 34 */ OP_ld_byte,	/* 35 */ OP_ld_word,	/* 36 */ OP_ld_dword,	/* 37 */ OP_ld_value_byte,	/* 38 */ OP_ld_value_word,	/* 39 */ OP_ld_value_dword,	/* 40 */ OP_st_byte,	/* 41 */ OP_st_word,	/* 42 */ OP_st_dword,	/* 43 */ OP_pop,	/* 44 */ OP_call,	/* 45 */ OP_ld_value_byte_stack,	/* 46 */ OP_ld_value_word_stack,	/* 47 */ OP_ld_value_dword_stack,	NULL};

⌨️ 快捷键说明

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