📄 finsh_vm.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 + -