body, table{font-family: 微软雅黑}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

    有些FORTH系统可以处理多道任务,因此,可以增加任意数量的附加任务。这些任务可以是把一个FORTH的整个交互功能置于在终端上的某人管理下的“终端任务”,也可以是一个控制没有终端的硬件设备的“控制任务”。
    每个任务都需要有自己的“用户区”。用户区的大小和内容取决于任务类型; 
    每个终端任务具有自己的专用词典,pad,参数堆栈,输入信息缓冲区,返回堆栈和用户变量区。各个终端的词什么的不能通用。
    每个控制任务具有一对堆栈和一小组用户变量。由于控制任务不使用终端,它就不用它自己的词典,pad和信息缓冲区。

用户变量
    用户变量不同于一般的变量。对于 VARIABLE 定义的一般变量,其值是保存在词典条目的参数域中。但是每个用户变量中,其值是保存在称为“用户表”的数组中。它们的词典条目被设置在另一个地方,词典条目中包含一个检索用户表的位移量。当执行这个用户变量名时,比如DP,这个位移量被加到用户表的起始地址上。就得到了DP在用户表数组中的值的起始地址。这时候就可以用词@或!来操作。
用户变量的优点是:任意多个任务都可以使用变量的同一定义但可各自取得它自己的值。节省大量的空间。
比如执行  BASE  @  的任务都是从它自己的用户表中取得 BASE 的值。这就在系统中节省了大量的空间,而且仍然允许每个任务独立执行变量。
用户变量由词 USER 来定义。用户表中变量的次序和位移量依各个系统而定。
USER  (n  ---  )   使用形式:n  USER  名称   为定义词汇,它在指定的用户存储区内生成带有偏移 n 的用户变量。当以后执行<名称>时,留下16位存储单元的地址。由<名称>传送的初始地址内容显然是非定义的。是系统自己分配的。为 LMI 的使用保留了偏移0-57(0-39H),因此,应用软件应使用 64-127(40-7FH)范围内的偏移。
FORTH系统中有三种类型的变量:其值由整个FORTH系统使用的系统变量;其定义能被系统中的所有任务使用,但其值只对应单个任务的用户变量;第三种是普通变量。它既能由整个系统访问,又能仅由单个任务使用,这取决于他们是在OPERATOR中定义的,还是在专用任务中定义的。

词汇
----------------------------------------------------------------------------------------------------------------------------|
'   (  ---  addr  )----------------------------------------------------------------------------------------------------|
使用形式:   '   名称      (试图在词典中找到来自输入流中“名称”的词的地址)--------------------------------------------|
留下词典中该词汇“名称”的代码域地址。如果未在当前现役检索顺序中找到,“名称”就存在错误。它被称为小标---------|
----------------------------------------------------------------------------------------------------------------------------|
    FORTH 系统中有三类标准词汇:FORTH词汇,编辑程序词汇和汇编程序词汇。
除了属于编辑程序词汇的编辑命令之外,做笔记到现在所涉及的词都属于FORTH词汇。汇编程序词汇所包含的命令用来为特定机器编写汇编语言代码。汇编语言代码依机器不同而变化。
    FORTH系统中不管是属于哪一类词汇,所有定义都是按照被编辑的顺序加入词典。因此这些词汇的构成不是把词典分为几个不同的部分,而是互相交织但又独立链接成表的。
    如图所示,下图中三类词汇,每一类都有一个相同的词CURRENTER,但是 ' 词沿着篮球链搜寻时,只能找到在篮球词汇中的那个自己的词。
执行FORTH  ,EDITOR 或 ASSEMBLER 这三个命令中的任一个命令,可以改变词典的搜索范围。
FORTH  (  ---  )  主词汇支的名称。执行FORTH时它成为检索顺序中的第一个词汇支。FORTH是初始编译词汇支,并且是检索顺序中的第一个词汇支,新的定义成为FORTH词汇支的一部分,直到不同的编译词汇支被建立
EDITOR (  ---  )  把EDITOR词汇支选为当前检索顺序之首。
ASSEMBLER (  ---  )  如果覆盖(overlay)汇编程序未被装入,则将它装入。如果汇编程序已经驻留在内,则选择ASSEMBLER词汇支。    
FORTH 保证搜索的是FORTH词汇。但是,通常FORTH系统自动为我们改变搜索范围。
eg:系统开始处于FORTH词汇,当我们想把一个应用程序输入到块,某个编辑程序命令会把搜索范围自动转向编辑程序词汇。一直到装配该块并定义之前,系统都处于编辑程序词汇内。装配编译时,词 : 将自动使搜素范围回到它开始所处的词汇——FORTH词汇。
CONTEXT  (  ---  addr )  含有指向词汇支指针的变量;这个词汇支是当前检索顺序中的第一个词汇支。
CURRENT  (  ---  addr )  它把指定编译词汇支的用户变量的地址留在堆栈中。
DEFINITIONS  (  ---  )  使用形式:cccc  DEFINITIONS  把汇编词汇支改成与现役检索顺序中第一个词汇相同。
INTERPRET  ( --- )  解释输入流,由 >IN 索引,直到全部解释完。
EXECUTE  (  addr ---  )  执行其参数域地址在栈顶的词典条目。
>IN  (  --- addr  )  指向输入流中当前位置的指针
BLK  (  --- addr  )  若非0,指向由LOAD正在解释的块。若为0表示从终端(通过输入信息缓冲区)解释。
将要被搜索的词汇是由用户变量 CONTEXT 指明的。一些新的定义将要链接于词汇。链接词汇是由另一个称为 CURRENT 的变量指明。由于CURRENT一般指向FORTH词汇,所以新的定义通常都链接于FORTH词汇。
如果要将系统编译词链接于编辑程序和汇编程序词汇中,就要通过词 DEFINITIONS 来实现。
EDITOR  DEFINITIONS  中,EDITOR 置 CONTEXT 指向“编辑程序”。而词 DEFINITIONS 把 CONTEXT 中的内容复制进 CURRENT 。: DEFINITIONS     CONTEXT  @  CORRENT !  ;     执行这个命令之后,编译的任何词都将属于编译程序词汇,直到键入:  FORTH  DEFINITIONS  重新把CURRENT复位到指向“FORTH 词汇”为止。

多任务Forth系统内存布局的更多相关文章

  1. linux系统进程的内存布局

    内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...

  2. Anatomy of a Program in Memory.剖析程序的内存布局

    原文标题:Anatomy of a Program in Memory 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译 ...

  3. Linux进程地址空间 && 进程内存布局[转]

    一 进程空间分布概述       对于一个进程,其空间分布如下图所示: 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初始 ...

  4. c++ 对象的内存布局

    之前介绍过了普通对象比如系统自带的int等对象的对齐方式,在学习类型转换的时候遇到了自定义类型的继承体系中的downcast与upcast. 于是顺藤摸瓜,摸到了这里.发现还是 陈皓的博客里面写的最早 ...

  5. .NET对象的内存布局

    每个虚拟机都有它自己的对象布局,本文我们将针对sscli源码和windbg调试器来查看不同类型的.net对象布局. 在.net虚拟机里,每个对象都需要保存这些信息: 对象的类型: 对象实例的成员属性( ...

  6. Linux 内存布局

         本文主要简介在X86体系结构下和在ARM体系结构下,Linux内存布局的概况,力求简单明了,不过多深入概念,多以图示的方式来记忆理解,一图胜万言. Technorati 标签: 内存 布局 ...

  7. Qemu对x86静态内存布局的模拟

    快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com 本文适用于 QEMU-0.10.5 VS2008 欢迎转载,但请保留作者信息 在PC机中,由 ...

  8. C++ 对象的内存布局(上)

    C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击这里查看下篇>>> 前言 07年12月,我写了一篇<C++虚函数表解析>的文 ...

  9. 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别

    探讨C++ 变量生命周期.栈分配方式.类内存布局.Debug和Release程序的区别(一) 今天看博客园的文章,发现博问栏目中有一个网友的问题挺有趣的,就点进去看了下,标题是“C++生存期问题”,给 ...

随机推荐

  1. Linux平台 Oracle 18c RAC安装Part2:GI配置

    三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 共享存储LUN的赋权 3.4 使用Xmanager图形化界面配置GI 3 ...

  2. Mysql授权root用户远程登录

    默认情况下Mysql的root用户不支持远程登录,使用以下命令授权   [Charles@localhost ~]$ mysql -uroot -p123 MariaDB [(none)]> u ...

  3. Android -- 贝塞尔曲线公式的推导和简单使用

    1,最近看了几个不错的自定义view,发现里面都会涉及到贝塞尔曲线知识,深刻的了解到贝塞尔曲线是进阶自定义view的一座大山,so,今天先和大家来了解了解. 2,贝塞尔曲线作用十分广泛,简单举几个的栗 ...

  4. angularjs 绑定多个属性到下拉框

    绑定下拉框 angularjs  代码: //活动下拉切换 $scope.activityChange = function () { var cards = new Array(); var url ...

  5. web前端学习历程--排序

    一.js排序方法 1.按字母顺序排列: arr.sort() 2.按数值从小到大: function sortNumber(a,b)//排序函数 { return a - b } var arr = ...

  6. Sql 按照指定天数时间段查询

    BEGIN TRY DECLARE @BeginTime DATETIME='2017-02-01' DECLARE @EndTime DATETIME='2017-03-3 23:59:59' -- ...

  7. kylin对接hive实现实时查询

     前提: 安装kylin之前,需要安装hadoop2.0.hbase.hive,并且对版本有要求,可以参照官网链接 http://kylin.apache.org/cn/docs/install/in ...

  8. 使用java进行 AES 加密 解密?

    百度百科是这样定义的: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标 ...

  9. sed 正则的一个小问题

    有一段类似以下的文本 aabbccc test[3307]112323553-66778tp aooppx69tp ooppsg aabbccc test[3307]1127233-6674tp bo ...

  10. Vue基础进阶 之 自定义指令

    自定义指令-----钩子函数 自定义指令 除了内置指令,Vue也允许用户自定义指令: 注册指令:通过全局API Vue.directive可以注册自定义指令: 自定义指令的钩子函数: bind: in ...