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

📄 finsh_vm.c.svn-base

📁 RT-Thread是发展中的下一代微内核嵌入式实时操作系统
💻 SVN-BASE
字号:
#include <finsh.h>#include "finsh_vm.h"#include "finsh_ops.h"#include "finsh_var.h"/* stack */union finsh_value	finsh_vm_stack[FINSH_STACK_MAX];/* text segment */u_char				text_segment[FINSH_TEXT_MAX];union finsh_value*	finsh_sp;		/* stack pointer */u_char*				finsh_pc;		/* PC */// #define VM_DISASSEMBLEvoid finsh_vm_run(){	u_char op;	/* if want to disassemble the bytecode, please define VM_DISASSEMBLE */#ifdef VM_DISASSEMBLE	void finsh_disassemble();	finsh_disassemble();#endif	/* set sp(stack pointer) to the beginning of stack */	finsh_sp = &finsh_vm_stack[0];	/* set pc to the beginning of text segment */	finsh_pc = &text_segment[0];	while ((finsh_pc - &text_segment[0] >= 0) &&		(finsh_pc - &text_segment[0] < FINSH_TEXT_MAX))	{		/* get op */		op = *finsh_pc++;		/* call op function */		op_table[op]();	}}struct finsh_syscall* finsh_syscall_lookup(const char* name){	register int i;	i = 0;	while(global_syscall_table[i].name != NULL)	{		if (strncmp(global_syscall_table[i].name, name, FINSH_NAME_MAX) == 0)			break;		i++;	}	if (global_syscall_table[i].name != NULL)		return &global_syscall_table[i];	return NULL;}#ifdef VM_DISASSEMBLE#include <stdio.h>void finsh_disassemble(){	u_char *pc, op;	pc = &text_segment[0];	while (*pc != 0)	{		op = *pc;		switch (op)		{		case FINSH_OP_ADD_BYTE:			pc ++;			printf("addb\n");			break;		case FINSH_OP_SUB_BYTE:			pc ++;			printf("subb\n");			break;		case FINSH_OP_DIV_BYTE:			pc ++;			printf("divb\n");			break;		case FINSH_OP_MOD_BYTE:			pc ++;			printf("modb\n");			break;		case FINSH_OP_MUL_BYTE:			pc ++;			printf("mulb\n");			break;		case FINSH_OP_AND_BYTE:			pc ++;			printf("andb\n");			break;		case FINSH_OP_OR_BYTE:			pc ++;			printf("orb\n");			break;		case FINSH_OP_XOR_BYTE:			pc ++;			printf("xorb\n");			break;		case FINSH_OP_BITWISE_BYTE:			pc ++;			printf("bwb\n");			break;		case FINSH_OP_SHL_BYTE:			pc ++;			printf("shlb\n");			break;		case FINSH_OP_SHR_BYTE:			pc ++;			printf("shrb\n");			break;		case FINSH_OP_LD_BYTE:			pc ++;			printf("ldb %d\n", *pc++);			break;		case FINSH_OP_LD_VALUE_BYTE:			pc ++;			printf("ldb [0x%x]\n", FINSH_GET32(pc));			pc += 4;			break;		case FINSH_OP_ST_BYTE:			pc ++;			printf("stb\n");			break;		case FINSH_OP_ADD_WORD:			pc ++;			printf("addw\n");			break;		case FINSH_OP_SUB_WORD:			pc ++;			printf("subw\n");			break;		case FINSH_OP_DIV_WORD:			pc ++;			printf("divw\n");			break;		case FINSH_OP_MOD_WORD:			pc ++;			printf("modw\n");			break;		case FINSH_OP_MUL_WORD:			pc ++;			printf("mulw\n");			break;		case FINSH_OP_AND_WORD:			pc ++;			printf("andw\n");			break;		case FINSH_OP_OR_WORD:			pc ++;			printf("orw\n");			break;		case FINSH_OP_XOR_WORD:			pc ++;			printf("xorw\n");			break;		case FINSH_OP_BITWISE_WORD:			pc ++;			printf("bww\n");			break;		case FINSH_OP_SHL_WORD:			pc ++;			printf("shlw\n");			break;		case FINSH_OP_SHR_WORD:			pc ++;			printf("shrw\n");			break;		case FINSH_OP_LD_WORD:			pc ++;			printf("ldw %d\n", FINSH_GET16(pc));			pc += 2;			break;		case FINSH_OP_LD_VALUE_WORD:			pc ++;			printf("ldw [0x%x]\n", FINSH_GET32(pc));			pc += 4;			break;		case FINSH_OP_ST_WORD:			pc ++;			printf("stw\n");			break;		case FINSH_OP_ADD_DWORD:			pc ++;			printf("addd\n");			break;		case FINSH_OP_SUB_DWORD:			pc ++;			printf("subd\n");			break;		case FINSH_OP_DIV_DWORD:			pc ++;			printf("divd\n");			break;		case FINSH_OP_MOD_DWORD:			pc ++;			printf("modd\n");			break;		case FINSH_OP_MUL_DWORD:			pc ++;			printf("muld\n");			break;		case FINSH_OP_AND_DWORD:			pc ++;			printf("andd\n");			break;		case FINSH_OP_OR_DWORD:			pc ++;			printf("ord\n");			break;		case FINSH_OP_XOR_DWORD:			pc ++;			printf("xord\n");			break;		case FINSH_OP_BITWISE_DWORD:			pc ++;			printf("bwd\n");			break;		case FINSH_OP_SHL_DWORD:			pc ++;			printf("shld\n");			break;		case FINSH_OP_SHR_DWORD:			pc ++;			printf("shrd\n");			break;		case FINSH_OP_LD_DWORD:			pc ++;			printf("ldd 0x%x\n", FINSH_GET32(pc));			pc += 4;			break;		case FINSH_OP_LD_VALUE_DWORD:			pc ++;			printf("ldd [0x%x]\n", FINSH_GET32(pc));			pc += 4;			break;		case FINSH_OP_ST_DWORD:			pc ++;			printf("std\n");			break;		case FINSH_OP_POP:			printf("pop\n");			pc ++;			break;		case FINSH_OP_SYSCALL:			pc ++;			printf("syscall %d\n", *pc++);			break;		case FINSH_OP_LD_VALUE_BYTE_STACK:			pc ++;			printf("ldb [sp]\n");			break;		case FINSH_OP_LD_VALUE_WORD_STACK:			pc ++;			printf("ldw [sp]\n");			break;		case FINSH_OP_LD_VALUE_DWORD_STACK:			pc ++;			printf("ldd [sp]\n");			break;		default:			return;		}	}}#endif

⌨️ 快捷键说明

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