FORTH汇编语言程序设计方法探讨

时间:2022-07-29 03:38:43

FORTH汇编语言程序设计方法探讨

摘 要 随着嵌入式系统越来越广泛地应用到百姓的生活中,嵌入式软件的开发规模也在不断扩大,汇编语言可对硬件直接操作、精确执行,因此依然是嵌入式系统开发的最优选择。forth的新命令能用已定义的命令进行新命令的扩充,也可用主处理机的汇编语言来编写;反之,汇编程序可用在FORTH词典中生成新的机器语言基元,FORTH程序采用汇编程序中的一些常用词,可有效地提高运行速度,是非常适合嵌入式系统开发的方法。本文自定义了汇编语言语法,研究了实现自定义汇编语言编译器的方法,列举了使用自定义FORTH汇编语言的基本方法,最后以一个中断程序为例验证自定义汇编语言。通过本文的研究、实验证明了FORTH汇编语言很适合应用于过程控制类、调试依赖于时间的嵌入式系统应用。

【关键词】FORTH 汇编语言 中断程序

1 引言

汇编语言是人和计算机沟通的最直接的方式,它描述了机器最终所要执行的指令序列,所以汇编语言一直是计算机学科必学的一门基础课程。通过这门课的学习既能获得底层编程的体验,又能深刻理解机器运行程序的机理。FORTH是一种与众不同的计算机程序设计语言,采用自底向上的构造方式,用汇编语言编写核心单词,实现内部数据结构和解释/编译机制,构造最小的系统,然后将该系统运行在宿主机上,进而编译的其它高层单词,形成一个完整的系统。

本文是在研究了FORTH的自生成技术的基础上,自定义了一套汇编语言语法,并且构造出将自定义汇编语言转换为CPU机器码的编译器,讲解了自定义汇编语言的基本使用方法,最后以中断程序为例,介绍了自定义FORTH汇编程序的实现方式。

2 FORTH汇编语言和编译器的实现方法

基本的FORTH平台内不含产生机器码的汇编语言编译器,只是将一个用FORTH语言写的汇编语言编译器的源代码作为附件。一般我们可以使用这个编译器,但也可以自己按照自己的习惯构造自己的语法和编译器。

实现编译器,首先要制订语言规范。由于FORTH汇编语言并没有权威的规范,甚至有些要开发的目标芯片就还没有汇编语言标准可以借鉴,因此程序开发者完全可以编写自己的编译器和创造自己的规范。FORTH汇编语言的语法规范是模仿常用的汇编语言,只是将表达式写成“逆波兰”形式,即将操作符写在操作数后面。以8086汇编为例,将AX减去BX的内容,结果在AX中,标准的汇编语言为:SUB AX, BX ,在FORTH汇编语言规范中可以模仿标准的汇编语言规定为:AX, BX SUB,也可以采用这种写法:BX AX SUB,,不仅逗号移到了操作数那里,而且目的操作数也移到了右面。虽然FORTH汇编语言规范存在这种任意性,但如果存在标准的汇编语言,除了将操作符写在右面,还是尽量保持标准的风格,这样容易和别人交流。

实现FORTH汇编编译器,主要利用FORTH字“C,”、“,”和“Here”,它们分别是向程序区依次放一个字节的二进制指令、两个字节的二进制指令和给出存放下一个指令的地址。

以8086为例,无操作数的中断返回指令IRET,可以这样实现:

语法: IRET

实现: : IRET CF C, ; //将IRET的机器码CF一个字节放到当前的指令流中

单操作数的跳转指令JMP,可以这样实现:

语法: LLLL JMP //LLLL定义了转跳的地址

实现: : JMP E8 C, ,;

同样上面实现的FORTH含义是将JPM的机器码E8一个字节放到当前的指令流中,然后再把已经在堆栈中的要跳转的地址作为16位偏移放到机器码E8之后,形成完整的跳转指令。

通常每个FORTH软件平台都有这个平台的汇编语言规范和编译器,但是如果要生成异构的FORTH系统,重新制定新CPU的汇编语言规范和编译器就是必须要完成的任务。

2.1目标代码的存取

由于一般FORTH目标系统的核心规模较小,16位的系统不超过64KB,32位的系统也用不完内存空间,因此可以直接在宿主机FORTH系统管理的内存中划出一块高内存区域用于目标代码的存取。假如P!和P@是原内存的写入和读取字,目标代码区域的起点是C000,则目标代码的存取字可以简单的定义为下面的算法:

C000 CONSTANT Origin

// 定义常数 Origin,它的值是目标代码区域的起点

: ! Origin + P! ; : @ Origin + P@ ; // 定义目标区的数据存取字

同样也可以产生按字节的存取字C!和C@。

2.2 机器码写入

汇编语言所产生目标机的机器码是顺序存放的,其中跳转指令是代码的当前位置参考计算的,因此可以设置一个当前代码地址指针CP实现:

Variable CP : Here CP @ ; // Here字给出下一个机器码存放的地址

: C, Here C! CP @ 1+ CP ! ; // 放一个字节的机器码到目标区

: , Here ! CP @ 2+ CP ! ; // 放一个16位字的机器码到目标区

有了这些FORTH字,可以不用助记符和汇编,直接把二进制代码一个字节一个字节地生成目标码。

2.3 向前跳转地址

机器码中最重要的指令就是根据条件进行转移的指令。由于FORTH语言的工作过程是按照输入流一个字、一个字顺序解释执行的,因此向前转移时目的地址是已知的,实现起来比较简单:以目标地址为值定义一个常数,然后在生成转移指令时引用它。

: L: Here Constant ; // 以当前地址定义一个常数

上一篇:小议馆员综合素养的要求 下一篇:对职业教育班主任工作的思考