代码拉取完成,页面将自动刷新
一个C语言实现超精简虚拟机
以最低成本实现一个自定义指令集的虚拟机,争取两个小时吃透这套项目的内容
虚拟机就是从一堆数字中,读取指令、解码指令,执行指令的虚拟计算机,为什么说是虚拟的,因为真实的计算机是使用CPU这个硬件完成这一系列操作的,而我们是使用变成语言来模拟这一些操作。
这可能与你实际认识不符,当我们查看一个文件是否,如果是2进制,则是一大堆0和1,如果是16进制,则是1-F之间的两个字符为一组的编码序列。是的,计算机并不认识除了0和1之外的东西,我们编写的C语言和汇编语言最终都要被编译成二进制的机器码,CPU负责解析和执行这些机器码。
但是在我们这里,我们还是以人类可读的编码来编写我们的虚拟机。
正如上述,虚拟机主要功能是:读取、解码、执行。
PSH 5 ;负责将数字5入栈,并且SP(栈指针寄存器)+1
PSH 6 ;负责将数字6入站,并且SP(栈指针寄存器)+1
ADD ;负责从栈顶弹出两个值,此时SP - 2, ADD指令完成后,将结果入栈,此时SP+1
POP ;负责从栈顶弹出一个值,同时SP-1,这里我们出于调试目的,将打印这个弹出的值
HLT ;程序停止在这里
这里如果使用C语言编写,将是这样的:
#include<stdio.h>
int main(int argc, char * argv[]) {
int a = 5;
int b = 6;
int result = a + b;
print("%d + %d = %d\n", a, b, result);
return 0;
}
出于一切以简单为原则,我们的目录结构设计如下:
.
├── main.c 虚拟机源代码
├── makefile makefile工程管理文件
└── README.md 项目说明文件
每一步的实现我们最终都会归档到docs/<序号>.md中,最终的main.c
只包括最终代码,不过中间过程的代码。如果需要,你可以将markdown的每一步代码单独复制到main.c
中编译运行。
那么,从这里开始,起步一起学习吧~
我们要做的事情就是上面一节的指令这一块,假设我们现在已经实现了这个虚拟机,那么如何测试这个虚拟机?
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。