⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vmbeta.txt

📁 VmBasic是一款基于虚拟机的结构化的编程语言
💻 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 + -