新闻中心

EEPW首页>嵌入式系统>设计应用> 嵌入式FORTH虚拟计算机的实现

嵌入式FORTH虚拟计算机的实现

作者: 时间:2013-12-17 来源:网络 收藏

3.指令的定义和存储

本文引用地址://m.amcfsurvey.com/article/256992.htm


采用该虚拟指令的存储地址来表示该指令,称为“地址码”。的每个指令用名称(例如+、-、*)来表示,称为“字(Word)”。的指令包括“复合字”和“基本字”。基本字也称为“低级字”,由真实计算机机器码和数据组成的,低级字组合可构成“复合字”,所以,“复合字”也称为“高级字”。


高级字和低级字都可通过定义扩展。扩展高级字用“:”冒号定义,通过高级字定义用已有的指令形成新的指令。格式如下:


:名字 … leave … ;其中执行leave指令可以跳出该字的执行,忽略掉其后的指令。扩展低级字则用机器码定义,格式如下:


CODE名字 … … NEXT, END-CODE其中NEXT,指令可以让计算机执行下一条虚拟机指令。


对于真实计算机,用编译器生成的指令码序列中不需要保留指令名称。FORTH虚拟计算机不同,由于需要虚拟机执行和构造新的虚拟机指令,因此在虚拟计算机中要保留FORTH字的名称,用于存储FORTH字的存储空间就是“字典表”。在JLP FORTH虚拟平台中,字典表结构如表1,在图1中也有标注。


WPF里存储的指令码即FORTH字在存储空间的地址。由于允许FORTH字的名称长度不一样,因此采用链表结构可有效地存储它们,在LPF中即存放了下一个字的定义地址。


代码场和参数场用于共同存储FORTH字,如表2。


其中CFA存放实现虚拟机功能的CPU机器码开始地址。PFA依次存放组成它的虚拟机指令。对于基本字PFA的内容不一样。对于一个常数基本字,PFA就直接存放这个常数。对于一个变量基本字,PFA就存放数据段中这个变量的地址[6]。

4.内存和指针分配


以往FORTH并未将代码和数据分开,在应用中,往往指令和程序相对固定,而代码和数据混合致使调试不方便,同时在系统安全上也带来问题。在JLP FORTH虚拟机上,将内存分为代码段CS、代码空间VS、数据段DS、系统段SS四个部分。


(1)代码段CS:存放真实计算机的机器指令、内存分配信息以及与硬件有关的系统数据。


(2)“代码”空间VS:用来存放虚拟计算机的指令和字典。


(3)数据段DS:用来存放用户数据和虚拟机的堆栈等数据。


(4)系统段SS:用来存放系统堆栈和多任务系统数据表等,达到分离系统任务和用户,保证系统安全的目的。


采用这种存放方式,就可将CS和VS放在FLASH中,将DS和SS放在RAM,如此实现程序和数据的分离。这种新的虚拟机架构不仅可以适合系统,也适合PC结构系统,而且更有利于内存保护的实现。


真实计算机主要依靠寄存器来实现加减乘除等运算。例如将AX和BX寄存器的内容相加结果放到AX中,因此寄存器的数量是衡量CPU运算能力的一个指标。FORTH虚拟计算机则采用直接面向运算过程的方法,采用堆栈的方式来实现简单的运算,例如取出堆栈顶上的两个数相加后,结果放回堆栈顶。对于复杂运算,直接用复合字或者机器码写出面向数据的算法,比如对矢量和矩阵的运算等。由于没有寄存器的概念,只有表示系统工作状态的各种系统变量以及实现系统运行的各种指针。为了提高虚拟计算机的执行效率,用间接寻址的CPU寄存器来实现。对应关系如下(注:箭头为在X86计算机中对应的寄存器)。


通过这些指针的定义,FORTH虚拟机可实现各种各样复杂的算法。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭