(1)Forth是纯结构化的编程语言,Forth语言里没有,也不允许有“goto”语句来让程序跳转到某个地方继续执行。 (2)笔者多年来一直在PC-DOS 环境下进行Forth系统的研究工作。2007年开始研究“Forth交叉编译器”,即使用一个运行在DOS环境下的Fort系统,通过对异机种单片机(非80x86指令集)的汇编语言程序进行编译,生成目标机的HEX烧录文件,然后由该单片机的烧录器将HEX文件二进制机器码烧录到单片机后,单片机独立运行。下图上当时的设计说明: 当时把异机种单片机指令集的汇编语言称为“J#”计算机语言。
(3)笔者在2009年8月就已经用“JL META交叉编译平台”在8051单片机上实现了“JL51 Forth系统”: (3)JL51 Forth系统的特点: 1)单片机:C8051F020,64KB FLASH,4096字节XDATA,256字节IDATA。 2)JL51 Forth系统的HEX烧录到C8051F单片机中后独立运行,通过RS-232串口与PC机或笔记本电脑通讯。 3)PC机上通过“超级终端”软件与单片机通讯。在超级终端上用户可以直接输入“Forth命令”,比如输入“LIST<CR>”,单片机上的Forth系统就会在超级终端的屏幕上列出系统的所有Forth字。 当然也可以输入一行标准Forth程序: 1 2 3 * + .<CR>,这时单片机Forth系统就会将表达式“1+2*3”的计算结果“7”显示在超级终端上。 4)JL51系统除了标准的Forth功能外,也增加了8051单片机的功能,比如在PC机超级终端上输入Forth程序“ HEX 55 P0!<CR>”,则就会将十六进制数“55”送给P0端口,连接在P0端口上的LED灯就会交替的亮和不亮。
(4)JL51 Forth系统使用的Forth语言是纯结构化的编程语言,它只支持下面的语法结构,不支持goto语句:
(5)8051指令集里面本身就具有类似C语言“goto”语句的“LJMP”长转移指令(转移地址偏移可以为64KB),因此WD-Forth 8051中会有这样的程序: Main_Loop 将十六进制数 55 写入_P0, 将十六进制数 33 写入_P1, 将十六进制数 F0 写入_P2, 延时500毫秒, 将十六进制数 AA 写入_P0, 将十六进制数 CC 写入_P1, 将十六进制数 0F 写入_P2, 延时500毫秒, 向 Main_Loop 转移,
(6)但是对于Forth 8051汇编语言而言,要想消除“goto”语句,引入结构化编程语法也是很容易得。下图是改进后的结果: 经过新增加第108行和第109行的定义,下面的第125行和第135行程序看起来就像C语言一样是“面向结构”的程序了。
|