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. One VS Rest

    简单来说就是分类的类别有多个,不再是二分,比如根据某些特征,什么温度.湿度.空气流动情况来预测天气,天气的label不能说是好天气和坏天气两种,而是分晴天.雨天.阴天,雪天等等,对于决策树或者从计算机 ...

  2. 《linux就该这么学》第八节课:第六章存储结构与磁盘划分

     笔记 (借鉴请修改) 6.3.文件系统与数据资料 目前linux最常见的文件系统: ext3:日志文件系统.宕机时可自动恢复数据资料,容量越大恢复时间越长,且不能保证百分百不丢失.   ext4:e ...

  3. 第一章 JQuery概述

    1.JQuery的作用:访问和操作DOM元素控制页面样式对页面事件进行处理扩展新的JQuery插件与Ajax技术完美结合注:JQuery能完成的效果js都能完成,但是JQuery的开发效率更高,代码更 ...

  4. STM32的型号的命名规则

    每种STM32的产品都由16个字母或数字构成的编号标示,用户向ST订货时必须使用这个编号指定需要的产品.这16个字符分为8个部分,下面通过一个例子说明它们的意义: STM32 F C T xxx ST ...

  5. function(){}、var fun=function(){}和function fun(){}的区别

    一.基本定义 1.函数声明:使用function声明函数,并指定函数名. function fun() { // ...... } 2.函数表达式:使用function声明函数,但未指定函数名,将匿名 ...

  6. Java笔记 #05# Java Native Interface

    参考资料:http://www.ntu.edu.sg/home/ehchua/programming/java/javanativeinterface.html(很详细) 看jdk源代码时,经常会看到 ...

  7. ORA-64379: Action cannot be performed on the tablespace assigned to FastStart while the feature is enabled

    解决方法: 禁止IM FastStart exec DBMS_INMEMORY_ADMIN.FASTSTART_DISABLE();

  8. java限制map大小,并FIFO淘汰

    有时候需要往一个MAP中写入一些记录,但又怕无限制地写入会导致内存爆掉,所以得限制这个MAP的大小. 实现:LinkedHashMap提供了简单的方法. 首先,定义一个最大数,比如1000,然后new ...

  9. 解决apache httpd列出目录列表中文乱码问题

    问题: 找了好几个方法都不对, 很多都是说修改AddDefaultCharset字段的, 下面是新的方法, 新测可行 在httpd.conf下, 随便找个地方把下面这个字段扔上去, 重启即可 Inde ...

  10. Bootstrap 可视化HTML编辑器,summernote

    Bootstrap 可视化HTML编辑器之summernote,用其官网上的介绍就是"Super Simple WYSIWYG editor",不过在我看来,与bootstrap中 ...