简单的虚拟机实现方法

易语言 2020-05-05 17:49:22

对于一个物理的处理器而言,他有自己的指令集,这些指令集可以认为是处理器众多功能部件的接口。
我们用编译器将编程语言写成的程序转换成与之等价的用指令集组成的序列表示的程序。
然后由物理机器读入这些指令序列并依次执行处理器相应的功能部件,于是程序就可以在物理机器上运行了。
而虚拟机本质上就是在物理之上再抽象出一个虚拟的机器,这个虚拟的机器有统一的指令集,我们只要将我们的源码翻译为虚拟机的指令集即可(类似于JAVA)。

这里我们用一个整数数组模拟内存,用ptr数据类型来模拟CS:IP寄存器的指针,并且人工写了对应的汇编。
C++
int sum = 0;for (int i = 1; i != 101; i++)
sum += i;

易语言
.版本 2
.支持库 spec

.程序集 程序集1

.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
.局部变量 sum, 整数型
.局部变量 i, 整数型

.变量循环首 (1, 100, 1, i)
sum = sum + i
.变量循环尾 ()
调试输出 (sum)
返回 (0) ' 可以根据您的需要返回任意数值

类汇编
0000 ILD 2, 101 // 放立即数101到2号内存单元
0001 ILD 3, 1 // 放立即数1到3号内存单元
0002 ILD 1, 1 // 放立即数1到变量i
0003 ILD 0, 0 // 放立即数0到变量sum
0004 ICMP 1, 2 // 比较i和101
0005 [FEQ] IJMP 3 // 如果相等(i==101)就跳转到9,因为指令执行完ip为6,所以+3就到了9
0006 IADD 0, 1 // sum += i
0007 IADD 1, 3 // i++,3号位保存的就是1
0008 IJMP -5 // 跳转到4,因为指令执行完ip为9,所以减5就到了指令4
0009 IOUT 0 // 输出sum
0010 ISTOP // 挂起