杨为民 发表于 2024-11-27 19:07:03

F351(7):倚天剑 Forth交叉编译器(DOS环境)

一、启动编译器(1)倚天剑 Forth 8051单片机 交叉编译器软件(YTJ-XCC51 V2.1)是由“我的Forth(以下简称WDForth)”、“交叉编译器”和“8051汇编语言编译器”三个部分组成,这三个部分已经集成在名为“YTJ_F051.COM”的DOS可执行程序中了。(2)倚天剑XCC51编译器的设计目标是对PC机上的STC单片机的Forth 8051程序进行编译,形成二进制的内存机器码映像,然后再生成HEX格式文件供STC-ISP软件烧录到目标单片机中运行,控制单片机实现各种功能。(3)由于“YTJ_F051.COM”的文件尺寸大于64KB,因此需要用MS-DOS 2.0版的多段加载程序“LOAD.COM”来加载执行。(4)用户只要双击批处理文件“YTJ_XCC51_V21.BAT”就可以启动倚天剑 Forth 8051单片机 交叉编译器软件(以下简称“倚天剑XCC51”),进入Forth8051交叉编译的DOS界面环境了。该批处理文件的内容为“LOAD.COM YTJ_F051.COM”。(5)如果用户有兴趣查看“YTJ_F051.COM”的代码,可以启动DOS环境的DEBUG程序。用户只要双击批处理文件“DEBUG_YTJ_XCC51_V21.BAT”即可。该文件的内容为“DEBUG LOAD.COMYTJ_F051.COM”(6)倚天剑XCC51启动后的界面如下图:
(7)在倚天剑XCC51环境中手工输入Forth命令。DOS窗口出现“JL>”的命令行提示符后,用户就可以手动输入Forth命令或者程序,输入以回车键为结束符,Forth系统就开始解释执行命令或者程序。比如在Forth中计算表达式“1+2*3”并显示结果的Forth程序为“12 3*+.<回车>”,在DOS命令窗口键入并执行这段的程序的结果为:
(8)一般的数学公式和计算高级语言采用中间波兰表达形式:操作符在操作室中间(1+2),而Forth语言采用逆波兰的表达形式:操作符在操作数后面( 12+ ),并且采用空格作为Forth字之间的分隔符,LISP语言采用前缀波兰表达形式( (+12) )。
二、加载与编译Forth程序(9)Forth程序行像英文句子一样,由一个个“Forth字”组成,字与字之间由空格分隔,以回车作为结束。Forth字也称“Forth命令”,可以从键盘上输入,也可以写在程序文件中作为程序输入。WDForth程序文件是纯文本文件,一般用“.J”为后缀来区分,可以用任何文本编辑器编辑。WDForth程序文件用“TF_LOAD”命令来加载,命令的格式为“TF_LOAD文件名”。
(10)倚天剑XCC51随编译器提供了一个求平均值得Forth程序“YTJ_DEMO.J”,进入Forth环境后,使用命令“TF-LOADYTJ_DEMO.J<回车>”就可以编译执行改范例程序了,像下图那样:
程序“YTJ_DEMO.J”定义了一个求平均值的Forth字“AV”,以后只要按照要求的格式输入N个数,就可以求出这N个数的平均值并显示出来了。如上图输入“11 22 33-44 4 AV<回车>”之后,就显示出“11,22,33, -44 ”这4个数的平均值为“5”来了。(11)Forth程序以精确无歧义和精简著称,“YTJ_DEMO.J”程序中求平均值的Forth字的定义只有一行:: AV DUP >S 0 SWAP 1 1 for + endfor S> / . ;总共15个单词,是世界上最短的求平均值计算机程序,没有之一。(12)倚天剑XCC51的设计目的是对PC机上的STC单片机的Forth 8051程序进行编译,然后生成HEX格式文件供STC-ISP软件烧录到目标单片机上,控制单片机实现各种功能。(13)倚天剑XCC51随编译器提供了一个最简单的STC打狗棒开发板上运行的“点亮LED灯” 程序,范例程序的文件名为“X51_DEMO.J”。手动输入“TF_LOAD X51_DEMO.J<回车>”命令后,系统显示OK或者退出,就表明编译成功了,如下图所示。
这时就可以看到倚天剑XCC51根据范例程序生成的“X51_DEMO.HEX”烧录文件了。烧录到STC打狗棒开发板后就可以看到连接到P2端口的LED灯隔一个亮一个了。(14)下图是范例程序“X51_DEMO.J”的内容:
使用倚天剑的8051程序一般分为5个部分:第1行到第5行的初始化部分设置倚天剑XCC51编译器。第7行到第9行定义P2端口的模式寄存器。逗号不是Forth语言里的分词符,所以可以作为Forth词名字的一部分。本程序加上逗号,使其在程序里看起来像8051汇编语言的左操作数。另外像P2这些最老的8051单片机的SFR寄存器,已经在Forth 8051 汇编语言中定义过了,用户就不用自己再定义了。第11行到第22行是对STC单片机的设置,为控制程序的运行建立起运行的环境。第25行到第31行是单片机控制程序的主循环部分,其中第28行将连接在P2端口上的LED灯隔一个亮一个。用户可以修改这行程序中的055数字,实现自己的灯亮花样。最后一部分第34行程序是将已经生成的机器码输出为HEX格式的烧录文件。其中Forth字“YTJ_HexOut”是烧录命令,其前面的数字是从地址0000开始输出的字节数,其后面的HEX文件的文件名。
三、结束语(15)倚天剑XCC51编译器有许多新颖的特点,但与常规编译器最大的不同点是厂商可以自己为某款8051单片机或者开发板定制专用的编译器,将该款单片机和开发板上的许多设备的驱动程序都内含在编译器里,成为某个或某类产品的“专属编译器”,大大方便终端用户的程序开发。本系列文章将以此介绍如何DIY自己的编译器。(16)虽然本文只有最简单的两个范例程序“YTJ_DEMO.J”和“X51_DEMO.”,但如果你实验成功了,就表示你已经有了新的一款开发STC8051单片机软件工具了,你就可以开始使用C语言和汇编语言外的第三种计算机语言来编写STC单片机程序了,你就可以开始探索你的“DIY自己的编译器”的路了。



杨为民 发表于 2024-11-27 19:16:37

本帖最后由 杨为民 于 2024-11-27 19:48 编辑

补充说明:
(1)这是去年发表的文章,当时还没有这个论坛。
(2)“YTJ_F051.COM”虽然只是一个DOS程序,却已经是一个完整的Forth系统了:
1)它使用DOS命令窗口与用户交流,可以执行很多命令了,所以它像“SHELL”的一样是一个命令环境。
2)它可以由用户指定一个DOS文件名,然后对该文件中的Forth程序进行“编译”,所以它是一个“编译器”。
3)如果被编译的文件是Forth 8051汇编语言程序,它会编译并生成一个HEX格式烧录文件,供用户烧录到STC单片机运行。所以它是一个“8051交叉编译器”。
4)如果被编译的文件是Forth语言程序文件,则它会解释执行这个程序,就像上面的举的求均值的程序例子。

5)如果被编译的文件是Forth 8086汇编语言程序,它会编译并生成一个“DOS环境下可执行的COM文件”,用户双击该文件名就可以执行它。所以它是也一个“8086-DOS程序编译器”。

(3)“YTJ_F051.COM”虽然只是一个DOS程序,却已经在内部集成了“DOS 2.0”文件系统了,用户可以用Forth命令或者Forth程序来:
1)建立新文件
2)打开现有文件
3)以文本或者二进制的方式读取文件

4)以文本或者二进制的方式写文件

5)改变当前目录
6)列出文件列表到DOS窗口上
7)...

(4)“YTJ_F051.COM”是一个DOS程序,如果不从Windows执行,直接从软盘或者U盘上的DOS环境执行,则可以用INT 13直接读写硬盘上的所有扇区数据,是极客的好工具。














页: [1]
查看完整版本: F351(7):倚天剑 Forth交叉编译器(DOS环境)