📄 vmbeta.txt
字号:
Reference of IVirtual Machince
虚拟机相关内容参考
本文档包括以下几个内容:
A.虚拟机的指令集和I/O说明
B.虚拟机的设计和工作原理
C.虚拟机的扩充方法
----------------------------------------------------------------------------------
VmBeta's Instructions and I/O interface
虚拟机Beta的指令集及I/O说明
1.虚拟机模拟栈式CPU一共有八个寄存器:
RP:指令寻址寄存器 RF:标志寄存器 RS:栈寄存器 RB:辅助栈寄存器 R0,R1,R2,R3:通用寄存器
标志寄存器RF的第0位到第3位分别为FZ(零标志) FB(小于标志) FA(大于)当用CMP指令比较两个
变量时比较的结果会更改三个标志,在用条件跳转指令JPC进行跳转时会根据JPC所给的条件查
询三个标志进行条件跳转
2.虚拟机指令有JMP(无条件跳转)JPC(条件跳转)CALL(调用)RET(返回)LD(数据装载)CAL(数据运算)
CMP(数据比较)PUSH(压栈)POP(弹栈)NOOP(空指令)IN(输入指令)OUT(输出指令)EXIT(推出指令)
等13条指令 支持类型有DWORD(32bit)/WORD(16b)/BYTE(8b)/INT(32b)/FLOAT(32b)
3.输出输入:
输入:INPUT
00.转化FLOAT类型的R3数据到INT类型
01.转化INT类型的R3数据到FLOAT类型
02.分配字符串,返回句柄
03.转化R3的字符串到INT类型并且返回
04.将R3的INT数字转化成R2所指字符串
05.将R3的字符串设置成R2的字符串
06.将R3的字符串末尾添加R2的字符串
07.求R3字符串的长度
08.释放R3的字符串
09.比较R3,R2两个字符串
0A.将R3的FLOAT类型转换成R2所指字符串
0B.将R3字符串转换成FLOAT类型并返回
0C.返回R3字符串的第R2个字符
0D.设置R3字符串第R2个字符成R1
0E.返回版本号前16个字节是主版本号,后16个字节是附版本号
0F.返回一个1KHz的时钟值,这个时钟从程序开始运行便启动
10.返回sin((float)R3)
11.返回cos((float)R3)
12.返回tan((float)R3)
13.返回sqrt((float)R3)
14.返回abs((int)R3)
15.返回abs((float)R3)
输出:OUTPUT
00.输出带'\n'的整数
01.输出带'\n'的字符串
02.输出不带'\n'的字符串
03.输出不带'\n'的整数
04.输出单个字符
05.输出不带'\n'的浮点
0A.输入整数到R3
0B.输入字符串到R3
0C.输入浮点数到R3
Design of the virtual machine
虚拟机的设计和工作原理
1. 基本工作原理
虚拟机的基本工作原理很简单,从内存中顺序取出虚拟机指令的字节码然后作出相应的操作
2. 基本的框架设定 IVMInstance
虚拟机的定义是在ivms.h里面,虚拟机概念被定义为实例HINSTANCE叫做IVMInstance,这个类是纯虚
类,没有任何实现,只是提供了基本接口。类IVMInstance里面定义了虚拟机的寄存器,内存空间,空间大
小,还有就是虚函数的接口:Process,VmIn,VmOut,VmError这四个成员函数是虚拟机实现之关键,Process
是从虚拟机空间的当前位置解释执行一条虚拟机命令,然后返回,这样以一条语句为单位的基本定义是为
了方便你在派生类中加入跟踪调试,断点等其他功能。VmIn是虚拟机的输入函数,VmOut是输出函数,
VmError是错误处理函数。
3. 具体的实现类 IVMBeta
IVMInstance被设计成纯虚函数,起一个框架作用。具体实现的一个虚拟机被命名为VmBeta在
ivmsbeta.h里面得到了定义,通过对IVMInstance的继承,重载并且实现了Process/VmIn/VmOut/VmError并
且加入了大量其他功能。所以说真正的指令解释是在IVMBeta类里面得到实现的。具体的解释方法也并没有
什么特殊的地方,可以参考ivmsbeta.cpp里面的实现
虚拟机的指令里面有IN/OUT两条指令控制输出输入,所谓向端口输入,输出解释程序并不做什么而是
调用VmIn/VmOut来处理发生的输出输入操作,这样通过处理函数的继承,重载实现了虚拟机功能的扩充,
因此有点象PC系列里面的中断调用功能而已。
4. 虚拟机文件的读取
在IVMBeta里面有方法Create实现了初始化化操作(及初始化虚拟机内存VirtualMem)。如果有数据来源
则同时拷贝数据到VirtualMem中,但是这样之可以装载二进制的数据,因此有了ivmca.h和ivmca.cpp来实现
读取VMS文件的方法,VMS文件中保存的是文本状态的虚拟机汇编指令,类ivmsca.h中IVMBetaAsm实现读取这
些汇编指令并且解释成二进制的代码方便运行,在以后虚拟机的读取并不应该直接读文本状态的汇编指令,
而要读取二进制的数据并且实现动态连接,这点由于时间关系,我有去实现。
Extend of virtual machine
对虚拟机进行扩展
之所以设计了虚拟机,就是为了让它扩展到各个方面,应用层比如某款软件的脚本系统,对它的扩展在
于继承类IVMInstance或者IVMBeta然后重载VmIn/VmOut前面提到:IN/OUT两条指令控制输出输入,所谓向端
口输入,输出解释程序并不做什么而是调用VmIn/VmOut来处理发生的输出输入操作,这样通过处理函数的继
承,重载实现了虚拟机功能的扩充。而VmIn里面定义的功能一般是虚拟机的一些最低级别的基础功能,比如
浮点数和整数之间的转化,字符串和整数,浮点数的转化sin/cos/sqrt等常用数学功能,在上面已经提到过
都是一些为语言服务的功能,并不和扩展应用和运行平台有关系,意思就是扩充时可以不必重载。而VmOut
里面定义的东西则大部分是和平台相关的东西了,比如输出打印字符串,浮点,整数,还有输入等等。那么
对于某项针对具体应用的功能,最好也扩展在输出部分。
扩展的例子,就是Windows下面的VmBeta程序,在目录ImApps下面的VmBeta可以具体看一下
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -