免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4868 | 回复: 5
打印 上一主题 下一主题

[C] TinyVM: A lightweight, fast virtual machine in < 500 lines of ANSI C [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-04 00:09 |只看该作者 |倒序浏览
昨天在 Hacker News 看到這個 post, 覺得對學 C 的會很有幫助. Tiny Virtual Machine 的代碼少於 500 行, 看起來不累又容易理解.

可以去 Github 下載: https://github.com/GenTiradentes/tinyvm

也可以直接下載附件
TinyVM.zip (12.35 KB, 下载次数: 81)

论坛徽章:
0
2 [报告]
发表于 2011-07-04 08:34 |只看该作者
it is really good.

论坛徽章:
0
3 [报告]
发表于 2011-07-04 09:13 |只看该作者

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2011-07-04 09:15 |只看该作者
不解释{:3_191:}

  1. void run_vm(virtual_machine* vm)
  2. {
  3. int instr_idx = vm->pProgram->start;

  4. for(;vm->pProgram->instr[instr_idx] != END; ++instr_idx)
  5. {
  6. int *arg0 = vm->pProgram->args[instr_idx][0], *arg1 = vm->pProgram->args[instr_idx][1];

  7. switch(vm->pProgram->instr[instr_idx])
  8. {
  9. case MOV: *arg0 = *arg1; break;
  10. case PUSH: stack_push(vm->pStack, arg0); break;
  11. case POP: stack_pop(vm->pStack, arg0); break;
  12. case INC: ++(*arg0); break;
  13. case DEC: --(*arg0); break;
  14. case ADD: *arg0 += *arg1; break;
  15. case SUB: *arg0 -= *arg1; break;
  16. case MUL: *arg0 *= *arg1; break;
  17. case DIV: *arg0 /= *arg1; break;
  18. case MOD: vm->pMemory->remainder = *arg0 % *arg1; break;
  19. case REM: *arg0 = vm->pMemory->remainder; break;
  20. case NOT: *arg0 = ~(*arg0); break;
  21. case XOR: *arg0 ^= *arg1; break;
  22. case OR: *arg0 |= *arg1; break;
  23. case AND: *arg0 &= *arg1; break;
  24. case SHL: *arg0 <<= *arg1; break;
  25. case SHR: *arg0 >>= *arg1; break;
  26. case CMP: vm->pMemory->FLAGS = ((*arg0 == *arg1) | (*arg0 > *arg1) << 1); break;
  27. case JMP: instr_idx = *arg0 - 1; break;
  28. case JE: if(vm->pMemory->FLAGS & 0x1) instr_idx = *arg0 - 1; break;
  29. case JNE: if(!(vm->pMemory->FLAGS & 0x1)) instr_idx = *arg0 - 1; break;
  30. case JG: if(vm->pMemory->FLAGS & 0x2) instr_idx = *arg0 - 1; break;
  31. case JGE: if(vm->pMemory->FLAGS & 0x3) instr_idx = *arg0 - 1; break;
  32. case JL: if(!(vm->pMemory->FLAGS & 0x3)) instr_idx = *arg0 - 1; break;
  33. case JLE: if(!(vm->pMemory->FLAGS & 0x2)) instr_idx = *arg0 - 1; break;
  34. };
  35. }
  36. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-07-04 09:27 |只看该作者
还好,不过不够深入

论坛徽章:
0
6 [报告]
发表于 2011-07-04 10:19 |只看该作者
回复 3# greensnow

good ! good!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP