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

📄 finsh_vm.c

📁 中国人自己的c语言
💻 C
字号:
#include "finsh_vm.h"
#include "finsh_ops.h"
#include "finsh_var.h"

/* stack */
union finsh_value	finsh_vm_stack[FINSH_STACK_MAX];

/* data segment */
struct finsh_var	data_segment[FINSH_VARIABLE_MAX];
/* text segment */
u_char				text_segment[FINSH_TEXT_MAX];

union finsh_value*	finsh_sp;		/* stack pointer */
u_char*				finsh_pc;		/* PC */

/* init finsh VM */
void finsh_vm_init()
{
	memset(finsh_vm_stack, 0, sizeof(finsh_vm_stack));
	memset(text_segment, 0, sizeof(text_segment));

	finsh_sp = &finsh_vm_stack[0];
	finsh_pc = &text_segment[0];
}

void finsh_vm_run()
{
	u_char op;

	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]();
	}
}

#if 0
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 %d\n", *pc++);
			break;

		case FINSH_OP_SUB_BYTE:
			pc ++;
			printf("subb %d\n", *pc++);
			break;

		case FINSH_OP_DIV_BYTE:
			pc ++;
			printf("divb %d\n", *pc++);
			break;

		case FINSH_OP_MOD_BYTE:
			pc ++;
			printf("modb %d\n", *pc++);
			break;

		case FINSH_OP_MUL_BYTE:
			pc ++;
			printf("mulb %d\n", *pc++);
			break;

		case FINSH_OP_AND_BYTE:
			pc ++;
			printf("andb %d\n", *pc++);
			break;

		case FINSH_OP_OR_BYTE:
			pc ++;
			printf("orb %d\n", *pc++);
			break;

		case FINSH_OP_XOR_BYTE:
			pc ++;
			printf("xorb %d\n", *pc++);
			break;

		case FINSH_OP_BITWISE_BYTE:
			pc ++;
			printf("bwb %d\n", *pc++);
			break;

		case FINSH_OP_SHL_BYTE:
			pc ++;
			printf("shlb %d\n", *pc++);
			break;

		case FINSH_OP_SHR_BYTE:
			pc ++;
			printf("shrb %d\n", *pc++);
			break;

		case FINSH_OP_LD_BYTE:
			pc ++;
			printf("ldb %d\n", *pc++);
			break;

		case FINSH_OP_LD_VALUE_BYTE:
			pc ++;
			printf("ldvb %d\n", *pc++);
			break;

		case FINSH_OP_ST_BYTE:
			pc ++;
			printf("stb\n");
			break;

		case FINSH_OP_ADD_WORD:
			pc ++;
			printf("addw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_SUB_WORD:
			pc ++;
			printf("subw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_DIV_WORD:
			pc ++;
			printf("divw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_MOD_WORD:
			pc ++;
			printf("modw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_MUL_WORD:
			pc ++;
			printf("mulw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_AND_WORD:
			pc ++;
			printf("andw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_OR_WORD:
			pc ++;
			printf("orw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_XOR_WORD:
			pc ++;
			printf("xorw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_BITWISE_WORD:
			pc ++;
			printf("bww %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_SHL_WORD:
			pc ++;
			printf("shlw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_SHR_WORD:
			pc ++;
			printf("shrw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_LD_WORD:
			pc ++;
			printf("ldw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_LD_VALUE_WORD:
			pc ++;
			printf("ldvw %d\n", *(u_short*)pc);
			pc += 2;
			break;

		case FINSH_OP_ST_WORD:
			pc ++;
			printf("stw\n");
			break;

		case FINSH_OP_ADD_DWORD:
			pc ++;
			printf("addd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_SUB_DWORD:
			pc ++;
			printf("subd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_DIV_DWORD:
			pc ++;
			printf("divd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_MOD_DWORD:
			pc ++;
			printf("modd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_MUL_DWORD:
			pc ++;
			printf("muld %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_AND_DWORD:
			pc ++;
			printf("andd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_OR_DWORD:
			pc ++;
			printf("ord %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_XOR_DWORD:
			pc ++;
			printf("xord %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_BITWISE_DWORD:
			pc ++;
			printf("bwd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_SHL_DWORD:
			pc ++;
			printf("shld %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_SHR_DWORD:
			pc ++;
			printf("shrd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_LD_DWORD:
			pc ++;
			printf("ldd %d\n", *(u_long*)pc);
			pc += 4;
			break;

		case FINSH_OP_LD_VALUE_DWORD:
			pc ++;
			printf("ldvd %d\n", *(u_long*)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;

		default:
			return;
		}
	}
}
#endif

⌨️ 快捷键说明

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