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. 大数据Spark+Kafka实时数据分析案例

    本案例利用Spark+Kafka实时分析男女生每秒购物人数,利用Spark Streaming实时处理用户购物日志,然后利用websocket将数据实时推送给浏览器,最后浏览器将接收到的数据实时展现, ...

  2. db2空值、null

    1. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,'')把NULL转换成''; 2. 输入类型为整型,且允许为空的,可以使用COALESCE(inputP ...

  3. [Android] TextView上同时显示图标和文字

    需求场景 +----------------------------+ | Icon TEXT | +----------------------------+ 当然,可以使用LineLayout,包 ...

  4. CentOS 7 搭建CA认证中心实现https取证

    CA认证中心简述 CA :CertificateAuthority的缩写,通常翻译成认证权威或者认证中心,主要用途是为用户发放数字证书 功能:证书发放.证书更新.证书撤销和证书验证. 作用:身份认证, ...

  5. java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl解决办法

    问题现象: 这种很可能出现在独立一个简单示例项目中可以用,但是在把webService模块加入系统后,报出这类错误. Exception in thread "main" java ...

  6. redis解决高并发下脏读问题

    //解决并发情况下卡脏读的问题 protected function BingFa($mobile, $ent_id){ $obj = EnterpriseMembers::getNewMemberC ...

  7. IDEA中文出现乱码解决(转)

    转自:http://lcl088005.iteye.com/blog/2284696 我是个idea的忠实用户,新公司的项目都是用eclipse做的,通过svn拉下代码后发现,注释的内容里,中文内容都 ...

  8. The Code analysis of the FFDNet model

    1. 读取图像并判断是否为灰度图,如为RGB图转化为灰度图,并读取图像的w.h 2.数据格式转换:将uint8表示的读取图像矩阵变为double表示. 3.加入噪声,如果噪声水平$\sigma = 5 ...

  9. 简单的sql server->bs或cs数据交互模式

    主要记录工作当中遇到的一些问题和总结的一些经验 客户端请求-->web服务接口-->sql 语句执行(存储在数据库中)-->web服务(客户端通过调用web服务接口)-->返回 ...

  10. 后端解决 微信H5支付 商户参数格式错误 方法

    问题如图: 后端解决方法: 在返回mweb_url 后不要直接访问这个链接,在当前页面用js window.location.href = mweb_url 这样跳转就可以了