body, table{font-family: 微软雅黑; font-size: 13.5pt}
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 语言允许发挥计算机的效率,并以简明灵活的结构为程序员提供了得心应手的软件开发工具。
FORTH 核心(Nucleus)的标准命令是用汇编语言直接编写的,也称为 CODE 词。FORTH 中 CODE 词的建立,是使 FORTH 的执行速度快于其他高级语言的一有效措施。
CODE 定义的词典条目的格式和冒号定义的词典条目结构基本相同。
CODE 定义和 冒号定义的区别:
1、在冒号定义的代码指针域中存放的是地址解释程序 NEST 的首址。当执行冒号定义时,首先转去执行地址解释程序,然后再执行存放在词身中的编译地址序列所代表的程序。
而在 CODE 定义的代码指针域中的内容总是该定义的参数域地址。当执行 CODE 定义时,则是直接执行词身中已汇编好的相应的机器代码序列。
2、当在编译冒号定义的时候,FORTH 计算机处于编译状态。从输入流中摘取的词并不被执行,而是把该词的代码指针域地址 CFA 编入冒号定义的参数域中。
在汇编过程中,FORTH 计算机处于解释状态。执行所有的汇编定义,其结果是将相应的机器代码编入 CODE 定义的参数域中。汇编过程比编译冒号定义要复杂的多,因此,汇编需要整个 FORTH 系统的支持。
3、当系统在运行中遇到以冒号开头的新定义时,首先使 context 词汇与 current 词汇相一致,然后再把组成该定义的每一个词的地址编译进参数域中,最后将该定义所在支链中的上一个词的 LFA 存入该定义的链接域中,并把该定义的 LFA 作为新的支链端存入当前词汇的参数域。于是完成了新定义的链接工作,使该定义成为一个新的冒号定义。
遇到 CODE 定义时,使 ASSEMBLER 词汇成为 context 词汇。ASSEMBLER 就把相应的汇编程序段汇编成机器代码存入词典。
4、CODE 定义中,汇编程序段必须由 NEXT 结束,以保证在 CODE 定义执行完毕后,能正确地转移到下一个将要执行的定义的地址。
冒号定义的最后一个成分是 UNNEST 的 CFA 。
FORTH 83 的 8086 汇编语言
FORTH 计算机中有一组专门用于存放必不可少的信息和控制程序执行的寄存器:
SP 参数堆栈指针 | RP 返回堆栈指针 |
IP 解释指针 | W 现行词指针 |
8086寄存器 | FORTH 寄存器 | 功能 |
AX | 累加器 | |
CX | 暂存、计数 | |
DX | 暂存、输入/输出控制 | |
BX | W | 现行词指针 |
SP | SP | 参数堆栈指针 |
BP | RP | 返回堆栈指针 |
SI | IP | 解释指针 |
DI | 暂存 |
// SP 作为数据堆栈的指针。在寄存器中,SP 能自动完成加 1 、减 1 的操作,其他寄存器不能。SI 、DI 除外。
// 8086 中的其他寄存器 AX、CX、DX和DI 能被*的运用于 CODE 定义中的汇编程序段中,但是不能通过这些寄存器把一个定义中的参数和其他信息传递到另一个定义中去。运用这些寄存器之前不用预置初值,CODE 定义结束也不必恢复,但是如果使用了SP、BP、IP 在 CODE 定义结束必须要恢复原来的值。