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和多用户poly FORTH 那样的多道程序系统。最简单的就是单用户的FORTH系统:
预编译系统(precompiled portion)
系统变量(System Variables)
任选定义(Elective Definitions)
用户词典(User Dictionary)
高速暂存缓冲区(The Pad)
输入信息缓冲区(Input Message Buffer)
用户变量区(User Variables)
块缓冲区(Block Buffers)
预编译系统(precompiled portion)
在内存低区驻留着系统唯一的预编译部分(已经被编译成词典形式)。在一些系统中,这种代码被保存在磁盘上(通常在1~8块中),当你启动或“引导”计算机时,他被自动装配进RAM低区。在另一些系统中,预编译部分永久驻留在PROM中,只要你一启动计算机它便可以被使用。
预编译部分通常包括大部分单字长算术运算符和数字格式化词,单字长栈操作符,编辑命令,转移和结构控制词,汇编程序,差不多笔记做到现在遇到过的定义词。也包括文本和地址解释程序。
系统变量(System Variables)
这个区域包含有预编译部分生成的并可由整个系统使用的“系统变量”。他们一般情况下是不能被用户使用的。
任选定义(Elective Definitions)
未被预编译的FORTH系统部分以源文本形式保存在磁盘上。这是为了更好的控制使用内存空间,可以根据需要决定装配还是不装配这些定义中的任何部分。所有“任选定义”的装配块称为“任选快”。比如16块,16 LOAD 可以加载一个小屏面编辑程序。
用户词典(User Dictionary)
在内存中能存贮自己定义的词的区域称为“用户词典”,词典区随着新词的增加向内存高区生成。词典中下一个可以用单元总是由变量 DP 指示。在编译过程中,随着词典条目的增加,指针 DP 也逐单元(或逐字节)地调整。因此,DP 是编译程序的书签;在词典中指向的位置是编译程序下次可编译的地方。
DP 可能被 ALLOT 使用。ALLOT 使DP向前推进给定数量的字节数。系统中有一个词 HERE 就是用DP实现的 。
DP ( --- addr ) 词典指针变量,它包含词典中下一个*存储地址,他的值可以由HERE给出,也可以由ALLOT更改。
HERE ( --- addr ) 把下一个可用词典位置的地址留在堆栈顶;(定义里面就用到了上面的指针变量 DP)
高速暂存缓冲区(The Pad)
词典中HERE一固定距离有一个小块叫做“高速暂存缓冲区”它通常用于保存先被操作然后送往终端的 ASCII 码字符串。例如,在使用 TYPE 之前,数字格式化词用这个区域来保存转换过程中的数字的 ASCII 码。
pad的大小没有限制。在大多数系统中,在pad的起点到参数堆栈栈顶之间有数百个甚至数千个字节。
由于pad的起始地址被规定与最后的词典条目有关,所以每当加入新的定义或执行了 FORGET 或 EMPTY 之后,该起始地址都会发生变化。但是这种安排是安全的。因为当上述时间中的任何一件发生时,pad都不会被用到。词 PAD 给出了pad的当前起始地址。
//可以看出pad的空间大小是256 (0-255)刚好是一个字节。
PAD ( --- addr ) 留下保存中间处理过程数据的暂存区低地址。PAD的地址或内容可以改变,如果下一个可用词典单元的地址被改变,则这些数据被舍弃。PAD的容量为84个字符。
参数堆栈(Parameter Stack)
数据压入数据堆栈的时候只是栈顶指针的移动;把一个数放入堆栈是,指针先减1,然后数值被存入指针指向的位置。一个数移出堆栈,指针增加1。(堆栈地址是从低到高,数据最先存在在地址高位上,向上增长也是就向着低地址方向增长)。数据堆栈是向下生长(向着地址减小的方向增长)
SP@ ( --- addr ) 将堆栈顶地址回送到堆栈顶的与计算机相关过程,所说的堆栈顶的地址是指在执行SP@之前的地址。(取出堆栈顶指针)
有了这个就可以随心所欲的访问堆栈中任意位置的元素。(最好不要在编程中使用)
S0 ( --- addr ) 含有“堆栈指针初始值的用户变量。
SP@ ( --- addr ) 将堆栈顶地址回送到堆栈顶的与计算机相关过程,所说的堆栈顶的地址是指在执行SP@之前的地址。
栈底由一个 S0 的变量指示。S0 的内容总是“空栈”单元的下一个单元的地址。
输入信息缓冲区(Input Message Buffer)
S0 也包含着“输入信息缓冲区”的起始地址。输入信息缓冲区向内存高区生成(与pad方向相同)。当从终端输入文本时,文本便存放在此缓冲区,文本解释程序将在此缓冲区内扫描文本。
返回堆栈(Return Stack)
在输入信息缓冲区的上面是返回堆栈,其操作相同于参数堆栈,但是返回堆栈没有类似于SP@和S0这样的高级FORTH词。
用户变量区(User Variables)
返回堆栈上面就是用于存放“用户变量”的内存区域,这些变量包括 BASE ,S0 ……
块缓冲区(Block Buffers)
在高端内存区是若干块缓冲区。每个缓冲区为一个磁盘块提供1024个字节空间。当访问磁盘快的时候(显示或装配),系统将该块从磁盘中复制到缓冲区,在缓冲区能由编辑程序修改该块或由 LOAD 解释该块。