前言:
此刻大家对“c语言汇编编译器”都比较珍视,兄弟们都需要了解一些“c语言汇编编译器”的相关资讯。那么小编也在网摘上搜集了一些对于“c语言汇编编译器””的相关文章,希望兄弟们能喜欢,咱们一起来了解一下吧!一、WDForth简介
(1)倚天剑 Forth 8051单片机 交叉编译器软件(以下简称倚天剑XCC51)是由“我的Forth(以下简称WDForth)”、“交叉编译器”和“8051汇编语言编译器”三个部分组成,这三个部分已经集成在一个名为“YTJ_F051.COM”的DOS可执行程序中了。
(2)倚天剑XCC51编译器的设计目标是对PC机上的STC单片机的Forth 8051程序进行编译,形成二进制的内存机器码映像,然后再生成HEX格式文件供STC-ISP软件烧录到目标单片机中运行,控制单片机实现各种功能。
(3)Forth语言与其他计算机语言最大的不同是用户可以自己定义新的语法,定义工作流程,甚至可以生成一个新的计算机语言。
例如你对原来Forth的条件分支程序结构语法“… IF … ELSE … THEN”和循环程序结构的语法“… DO … LOOP”不满意,你可以按你的意愿设计新的语法,然后生成一个新的Forth语言软件,在新的软件里,你和你的朋友就可以使用你自己定义的新语法结构来编写你自己的程序了。
(4)笔者喜欢BASIC语言,因为它对不擅长编程的科研人员十分友好,因此就编写了一个BASIC风格的DOS环境下运行的Forth系统,取名为“我的Forth”,其语法结构最大程度的借用了BASIC的。
比如在WDForth中,逻辑条件是用算术堆栈顶的整数来表示,数值为“非0”时表示逻辑“真”和数值为“0”时表示逻辑“假” 。这时WDForth的基本程序结构语法有下面5种形式:
1)条件分支结构
(条件) if … endif
(条件) if … else … endif
2)固定循环结构。
( 上限 下限 步长 ) for … exitfor … endfor
根据步长决定循环方向,初值至少做一次,上限和下限都能达到,其中执行exitfor指令时就从从该程序点跳出循环。
例:执行程序“0 10 -2 for I . endfor”时(其中I为最内层循环指标变量),结果显示为“10 8 6 4 2 0”。
3)后条件循环结构
repeat … exitrepeat … ( 条件* ) until
*条件:成立则退出循环
本循环结构至少执行一次,其中执行exitrepeat指令时就从该程序点跳出循环。
例:执行程序“0 repeat DUP . 2 + DUP 10 = until DROP”时,结果显示为“ 0 2 4 6 8 10”。
4)前条件循环结构
while … ( 条件* ) do … exitdo … loop
*条件:成立则进入循环,可能一次都不执行,其中执行exitdo指令时就从该程序点跳出循环。
例:执行程序“0 while DUP 10 != do DUP . 2 + loop DROP”时,结果显示为“ 0 2 4 6 8 10”。
5)程序块结构
begin … exit … end
本结构用于模块化结构,用exit代替GOTO语句。执行exit指令就可以让程序从该程序点跳出程序模块。
例子:程序块程序用于多重选择,其中if前面的条件可以是任意类型的逻辑表达式:
10 0 1 for
begin
I 1 = if … exit endif
I 3 = if … exit endif
I 5 = if … exit endif
I 7 = if … exit endif
I 9 = if … exit endif
… ( 这一部分是I为偶数时执行的程序 )
end
endfor
(5)WDForth的主要设计目标是一个规模可伸缩(从56KB到256KB,规模越大可供用户定制的内容就越多)的和可定制各种目标机机器指令的交叉编译器平台,为其配上不同的汇编语言编译器,就可以生成不同计算机上运行的目标程序。比如为WDForth配上8051汇编语言编译器,就可以生成在8051单片机运行的机器码。
再比如为WDForth配上8086汇编语言编译器,就可以生成PC机DOS下的可执行程序,甚至生成WDForth自己。
二、启动倚天剑XCC51交叉编译器
(6)倚天剑XCC51采用了256KB大模式的WDForth,并且为目标机留了64KB的CODE空间和64KB的XDATA映像空间,所以整个COM程序有384KB的大小。只是XDATA映像空间的静态数据要专门编写程序写入FLASH中,在系统引导时从FLASH复制到单片机的XRAM中。
(7)由于“YTJ_F051.COM”的文件尺寸大于64KB,因此需要用MS-DOS 2.0版的多段加载程序“LOAD.COM”来加载执行。
(8)用户只要双击批处理文件“YTJ_XCC51_V21.BAT”就可以启动倚天剑XCC51,进入Forth 8051交叉编译的DOS界面环境了。
该批处理文件的内容为“LOAD.COM YTJ_F051.COM”。
(9)如果用户有兴趣查看“YTJ_F051.COM”的代码,可以启动DOS环境的DEBUG程序。用户只要双击批处理文件“DEBUG_YTJ_XCC51_V21.BAT”即可。该文件的内容为“DEBUG LOAD.COM YTJ_F051.COM”
(10)倚天剑XCC51启动后的界面如下图:
(11)DOS窗口出现“JL>”的WDForth命令行提示符后,用户就可以手动输入Forth命令或者程序,输入以回车键为结束符,然后Forth系统就开始解释执行这一行命令或者程序。
比如要在Forth中计算表达式“1+2*3”并显示结果,其Forth程序(命令)为“1 2 3 * + . <回车>”,在DOS命令窗口键入并执行这段的程序的结果为:
(12)一般的数学公式和计算高级语言采用中间波兰表达形式:操作符写在操作数的中间(1+2),而Forth语言采用逆波兰的表达形式:操作符在操作数后面( 1 2 + ),并且采用空格作为Forth字之间的分隔符,另外作为“长期以来垄断人工智能领域的应用、作为应用人工智能而设计的语言和第一个声明式系内函数式程序设计语言”的LISP语言采用前缀波兰表达形式( (+ 1 2) )。FORTH语言与LISP语言相比同样的严谨和简洁,但因为少了“一大堆愚蠢的括号”而更胜一筹。
三、加载与编译Forth程序
(13)Forth程序行像英文句子一样,由一个个“Forth字”组成,字与字之间由空格分隔,以回车作为结束符。Forth字(语法作用类似C语言中的函数)也称“Forth命令”,可以从键盘上输入,也可以写在程序文件中作为程序输入。
WDForth程序文件是纯文本文件,一般用“.J”为后缀来区分,可以用任何文本编辑器编辑。
WDForth程序文件用“TF_LOAD”命令来加载,命令的格式为“TF_LOAD 文件名”。
(14)倚天剑XCC51随编译器提供了一个求平均值得Forth程序“YTJ_DEMO.J”,进入Forth环境后,使用命令“TF-LOAD YTJ_DEMO.J<回车>”就可以编译执行改范例程序了,像下图那样:
程序“YTJ_DEMO.J”定义了一个求平均值的Forth字“AV”,以后只要按照要求的格式输入N个数,就可以求出这N个数的平均值并显示出来了。
如上图输入“11 22 33 -44 4 AV<回车>”之后,就显示出“11,22,33, -44 ”这4个数的平均值为“5”来了。
(15)Forth程序以精确无歧义和精简著称,“YTJ_DEMO.J”程序中求平均值的Forth字的定义只有一行:
: AV DUP >S 0 SWAP 1 1 for + endfor S> / . ;
总共15个单词,是世界上最短的求平均值计算机程序了,没有之一。
(16)同时倚天剑XCC51随编译器提供了一个最简单的在STC打狗棒开发板上运行的“点亮LED灯”程序,范例程序的文件名为“X51_DEMO.J”。手动输入“TF_LOAD X51_DEMO.J<回车>”命令后,系统显示OK或者退出,就表明编译成功了,如下图所示。
这时就可以看到倚天剑XCC51根据范例程序生成的“X51_DEMO.HEX”烧录文件了。该文件烧录到STC打狗棒开发板上的效果如下图所示:
(17)下图是范例程序“X51_DEMO.J”的内容:
使用倚天剑的8051程序一般分为5个部分:
1) 第1行到第5行的初始化部分设置倚天剑XCC51编译器。
2) 第7行到第9行定义P2端口的模式寄存器。逗号不是Forth语言里的分词符,所以可以作为Forth字标识符的一部分。本程序加上逗号,可以使其在程序里看起来像8051汇编语言的左操作数。
另外像P2这些SRC单片机保留的、最老的8051单片机的SFR寄存器,已经在Forth 8051 汇编语言中定义过了,用户就不用自己再定义了。
3) 第11行到第22行是STC单片机加电或者复位时的系统设置,为单片机控制程序的运行建立起运行的环境。
4) 第25行到第31行是单片机控制程序的主循环部分,其中第28行将连接在P2端口上的LED灯隔一个亮一个。
用户可以修改这行程序中的 055数字,实现自己的灯亮花样。
5) 最后一部分第34行程序是将已经生成的机器码输出为HEX格式的烧录文件。其中Forth字“YTJ_HexOut”是烧录命令,其前面的数字是从地址0000开始输出的字节数,其后面的HEX文件的文件名。
四、后记
倚天剑XCC51编译器有许多新颖的特点,但与常规编译器最大的不同点是厂商可以自己为某款8051开发板定制专用的编译器,把单片机和开发板上的许多设备的驱动程序都内含在编译器里,成为某个或某类产品的“专属编译器”,大大方便终端用户的程序开发。本系列文章将以此介绍如何DIY自己的编译器。
标签: #c语言汇编编译器