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. input[type = 'date']标签。

    1.首先调用浏览器自带时间控件,input的type属性有以下几种写法: type=’date’ //显示年.月.日 type=‘month’//显示年.月 type=‘week’//显示年.周 ty ...

  2. sql 存储过程参数为空则不作为条件

    /****** Object: StoredProcedure [dbo].[GetCommonGroupByRegion] Script Date: 03/23/2017 17:31:18 **** ...

  3. C#-----类FileStream的使用

    1.枚举类FileMode 指定操作系统打开文件的方式 CreateNew  指定操作系统应创建一个新的文件 Create  指定操作系统应创建一个新的文件. 如果该文件已存在,则会覆盖它 Open  ...

  4. Java面试题整理---JVM篇

    1.JVM运行时内存区域划分?   2.内存溢出OOM和堆栈溢出SOE的案例.原因.排查及解决?   3.常用的JVM性能监控工具?   4.JVM参数设置?   5.类加载过程?   6.JVM内存 ...

  5. Redis初探-Redis安装

    官网地址:https://redis.io/download 最新版本是4.0,在这里本人下的是3.2 使用rz命令可以将Redis上传到Linux系统 首先要确定Linux上是否安装了gcc,没有则 ...

  6. 腾讯云centos7.2安装jdk1.7 tomcat7.0部署项目示例

    说实话win server的性能并不好,所以程序员必须会在Linux上安装环境,部署项目. 第一步,官网下载tomcat和jdk压缩文件*.tar.gz  下载路径如下: jdk:http://www ...

  7. tp剩余未验证内容-8

    模型类的自动验证? 分为自动验证, 和 动态验证(手工验证), 前者的验证规则是定义在模型类中的, 所以要自己创建 扩展的/继承的模型类, 同时用 D方法实例化模型类 而动态验证是 先调用 valid ...

  8. Java this关键字 学习笔记

    前言: 这篇博文就是系统的学习一下Java中的this关键字,本人对this关键字的理解知识简单的停留在对  类的成员变量进行赋值,这次所以决定系统的体会一下this 关键字 转自:https://b ...

  9. 在 mac iTerm2 中使用 cmd 终端

    在 mac iTerm2 中使用 cmd 终端 主要是因为要在 window 中做一些命令行上的工作, 但又不想切换到整个 window 系统里面去. 在程序和功能中开启 telnet 在服务中启用 ...

  10. linux安装nord,卸载nord源

    需要提前准备好:能使用的sock代理. 1.在这里 https://nordvpn.com/zh/download/linux/ 下载初始安装包,这包不是真正的软件,而是会给你添加一个源,大概为了安全 ...