1. 引言
随着计算机程序设计语言的不断发展以及windows 操作系统的广泛应用,绝大多数语言都推出了基于 windows平台的可视化编程语言,例如 C++的 VC++、Boland C++、基于basic 的VB基于pascal的Delphi等等。程序员编写软件时也摆脱了DOS方式,在 windows下就可以方便快捷地进行程序设计并获得相关的中文帮助信息。
汇编语言作为可以直接对计算机硬件进行操作的语言,无论语言和架构如何发展,其最高的执行效率和最直接的硬件操作都是不可替代的,这也是为什么绝大多数语言中都可以内嵌汇编语言的原因。而在实际工作中,能使用汇编语言熟练编写程序的工作人员却相当匮乏,究其原因,除了汇编语言比较抽象,难于掌握以外,一个主要的原因就是汇编语言的上机环境普遍使用的是基于命令行的编译、链接程序,没有集成开发环境,造成程序在编制和调试上的困难。
基于上述原因及实际工作需要,我们开发一个专用于SI02汇编语言的集成开发环境,以改善程序开发环境、提高编程效率。
2.SI02汇编语言简介
SI02是自行研制的一种16位的微处理器芯片,该芯片有自己的指令系统和汇编语言—SI02。SI02汇编语言不支持数据结构和数据类型,但是在语法、格式和结构等方面和C语言几乎完全一致,从而使用户更加易于掌握。SI02编程语言不区分大小写,但建议用户用小写字母编写程序,以便提高编译效率;SI02编程语言支持十进制和十六进制两种数据表示方法,其中十六进制的数据应以“0x”作为数据的开头。在使用该汇编语言编程时,要求遵循图1所示的程序结构。
以上各结构之中,除主程序之外都不是必要部分,但如若用到,则必须按照图中所示顺序出现。另外,程序结构中的数据块是指在一些应用问题中,需使用一些固定数据,如变换表格等,这些数据在SI02编程语言中以数据块的形式出现,数据块部分一般出现在程序的末尾,格式如下:
标号: 数据1;[注释]
………………
数据n;[注释]
此数据块的标号应作为系统常量定义。需要操作该数据块时,将标号赋给某个通用地址寄存器RA,然后按照存储器寻址方式操作就可以了。
3. 功能设计
通过详细分析,确定该集成开发环境的功能。
3.1 SI02IDE功能分析
用户针对SI02语言的程序进行编辑、编译和调试等相应操作,需要一种相应的集成开发工具,并且能在功能设置、使用方法和界面设计等方面尽量与主流集成开发环境相同或相似,从而便于用户使用,在这种要求下开发的SI02IDE主要具有以下五部分内容:菜单栏、工具栏、程序编辑窗口、工作环境窗口和信息输出窗口。其中工作环境窗口和信息输出窗口通过属性页或标签页结构可以同时显示多项内容。
1) 菜单:用户的文件、编辑、搜索、窗口等命令都可以通过菜单条上的命令发出。
2) 工具条窗口:用户的文件、编辑、搜索、窗口等命令都可以通过工具条窗口上的图形快捷按钮发出。
3) 工作环境窗口:可以显示系统目录、正在编辑的文件,文件中的函数以树形目录显示出来。可以通过双击打开文件,可以通过此窗口中的快捷菜单快速获得函数的位置。
4) 信息输出窗口:显示编译过程中各个阶段的状态和编译进度,以免编译时间较长时用户误会死机,还要显示编译时发现的错误名称及其类型和位置。显示查找结果,标明查找内容所在文件和行号,可以通过双击名称而使程序编辑窗口显示相应的内容。
5)文本编辑窗口:文本编辑窗口显示程序源文件,对SI02语言中的语法关键字进行高亮显示,并可以直接修改程序,而在调试过程中,这里将显示程序执行到的地点以及断点等信息。另外,目标文件、临时文件和头文件等也可以在这里显示。用户可以很方便的选择正在编辑的文件,并可以切换到全屏状态编辑。
另外,用户要在脱离SI02处理器的情况下,在PC机实现对SI02汇编程序的执行,那么需要使用软件的手段来实现该过程。在此情形下,开发软件仿真器也是很必要的,仿真(Emulator)就是在PC机中用软件模拟微处理器CPU的特性,实现对算术逻辑单元(ALU)和指令系统的仿真,使得由汇编程序产生的目标代码可以在汇编语言集成开发环境中运行,并具有调试功能。其必要性主要有以下因素:
1)要脱离真实的硬件,在可视化程度较高的界面下执行汇编程序,必须有仿真器模拟真实处理器的各项功能;
2)用户的汇编程序在执行过程中可能会用到某些存储空间,该仿真器能够使用软件手段为用户提供该空间;
3)在模拟执行用户程序时,用户需要设置断点、单步执行、连续执行、进入子程序和越过子程序等各种执行方式,仿真器应能对用户输入的调试命令进行识别并执行相应命令;
4)执行用户命令后,能对该命令的执行结果进行判断,并能根据判断结果修改相应的寄存器或存储器的内容;
5)该仿真器执行程序过程中应能保存源程序的相关信息,以方便通过界面反馈给用户。
3.2 SI02IDE功能设计
从以上对该集成开发环境的需求分析可以看出,该系统可以分为SI02语言编辑器、汇编和模拟执行三大功能模块。
1)SI02语言编辑器:它的主要功能是为程序员提供一个开发SI02源程序的界面。该界面上包括三个主要窗口:
(1)程序编辑窗口:主要用来编辑源程序,具有打开、关闭、复制、粘贴以及实现关键字变色等功能;而在程序调试过程中,这里将显示程序执行到的地点以及设置的断点等信息,程序单步执行时还跟踪显示程序执行的过程。另外,目标文件、临时文件和头文件等也可以在这里显示。
(2)工作环境窗口:该窗口以树型结构的形式来显示当前用户工程中所使用的函数文件,双击该某个结点时程序编辑窗口中会自动显示该结点上的文件或函数。
(3)信息输出窗口:主要用来显示编译信息和查找信息。
2)汇编程序:该模块的主要功能是把源程序汇编成目标代码文件。这里的源程序是SI02汇编语言程序,目标代码是SI02处理器的机器语言代码。
3)模拟执行程序:它的主要功能是模拟SI02处理器执行SI02机器语言文件。该模块和编辑器相结合,为用户提供设置断点单步执行、连续执行、执行到断点等各种程序调试手段,极大的提高了程序的开发效率。
根据以上对系统功能的划分以及各个模块的功能,可以得出系统的详细设计图如图3所示:程程序编辑器和模拟执行功能模块细分如图4所示。通过点击菜单条上的调试菜单项中除编译外的二级菜单,可以激发软件仿真类中相应的成员函数,实现调试的功能。既可以采用连续执行、跟踪(StepInto细分图单步运行且进入子程序)和步越(StepOver单步运行但不进入子程序)方式进行调试,也可以设置断点并使程序运行至断点处或运行至光标处进行调试。调试中可以打开特殊功能寄存器窗口、代码窗口(显示程序存储器的内容)和变量窗口,观察指令运行对特殊功能寄存器的影响,并可通过变量窗口查看变量的值
3.3 SI02IDE接口说明
1)List文件:列表文件List.lst提供源文件与目标文件中各行指令的对应关系,其一行格式为:
[SL:源文件行号][TL:目标文件行号]源程序内容
其中若源程序行没有与之相对应的目标程序行存在(比如注释),则与此源程序行对应的目标程序行号表示为[xxxxx]。
2)Obj文件:目标文件Obj.obj存储将源程序汇编生成的中间代码,其格式为三元式,描述一行如下:
L:行号,操作符,操作数1,操作数2;
其中,若两个操作数之一或全部不存在,则相应位置表示为xxxxx。
3)错误信息文件:错误信息文件用来存储程序汇编期间和模拟执行时发现的错误信息,包括错误类型、错误位置等;它有汇编和模拟执行程序写入,由编辑模块读出。
4)数据信息文件:用来存储程序执行结束后,存储器和寄存器里的数据信息。它由模拟执行程序写入,当用户需要这些信息时,由编辑器模块负责读出显示到界面相应的位置。
4.SI02IDE的实现
根据上节设计的系统功能可知,系统分别需要从以下三个方面实现。
4.1汇编程序的实现
汇编程序是将汇编语言转换为机器代码的软件,该过程的源语言是SI02汇编语言,目标语言是面向SI02芯片的机器代码。利用C++语言中类的封装性,将汇编程序作为整个软件中的一个类来处理。以确保数据成员的有效性,有效防止编程错误。该类的功能是将汇编源程序逐行读入,并进行判断、计算、分析,最后给出正确的机器码。
这需要对汇编源程序进行两次扫描,第一次扫描主要是对程序中所出现的变量以及标号建立档案,档案用于存放变量和标号的地址。第二次扫描主要是对整个源程序进行正确的译码,若源程序有错,给出所有出错信息,以便于检查和修改;源程序若无错误则生成可执行的目标代码。
汇编程序类中分别用三个数组保存了每条指令的行号、程序计数器地址、和字节数,以便在软件仿真类中使用。汇编结束要生成error.txt,list.txt和obj.txt三个配置文件,他们存放有关源汇编语言程序的相关信息,以便在调试模块中使用。
4.2 模拟执行程序(仿真程序)的实现
模拟执行程序(仿真程序)由C++语言编写的软件仿真的类来实现。该类被说明为汇编程序类的友员,以便访问汇编程序类的数据成员。
类中构造了一结构型变量来实现对硬件方面的仿真,并用一个成员函数来模拟指令执行的流程。该函数的参数是当前正运行的指令的PC值,返回将要运行的下条指令的PC值。
通过对汇编程序类中产生的每条指令所在的行号、程序计数器(PC)的地址、指令的机器码和字节数的分析,确定该指令是否改变了特殊功能寄存器、片内RAM、片外RAM以及程序计数器(PC) 的值。并根据分析的结果更新特殊功能寄存器和RAM的值。若该指令是跳转指令,需根据跳转条件判断跳转的地址,获得跳转到的行的PC值,作为函数的返回值。否则将源程序的PC值增加1。
当然,该开发环境还支持单步执行、执行到断点等程序调试方式,它们在实现方法上和连续执行基本一致,只是单步执行时每次只执行一条语句,然后等待用户输入新的命令才开始执行下条程序;执行到断点的实现,只需在连续执行流程中增加一个是否执行到断点了的判断语句:如果不是断点,则程序往下执行;如果是断点则停止执行,等待用户输入新的命令。而新命令的输入,则是通过编辑器界面上的调试菜单或键盘操作来实现。
4.3 编辑器(集成开发环境界面)的实现
界面设计的目的是为了提供良好的人机交互环境,集编辑、汇编、调试和通信于一体,便于使用。利用MFC的消息映像机制,通过鼠标和键盘事件来驱动相应程序的运行。面向程序设计语言的符号化调试技术的特点就是能够支持在源程序的任何程序语句上设置断点,并支持单步执行、连续执行、执行到断点等多种程序执行方式。
上述所有功能都要以交互的方式来完成,并且以调试时显示合适的源代码的行号的形式来达到这些目的。面向程序设计语言的符号调试,可以面向多种程序设计语言,我们做的这个开发环境主要面向SI02汇编语言的程序设计,因此我们所要开发的调试环境就是为这个使用汇编语言编写的程序提供调试服务。
面向程序设计语言的符号化调试技术的实现需要从编译或汇编连接系统中取得帮助,也就是说,编译或汇编连接系统在进行嵌入式软件的编译(汇编)生成时,要尽可能多的保留程序源代码的信息,即在所产生的目标代码文件中保存目标代码与源代码之间联系的信息。包括从源代码到目标代码的对应关系的信息、程序调试过程中出现的错误信息、以及源代码中所用到的符号的定义的信息。调试环境通过对目标文件结构进行分析,从已存在的信息中建立以下几种联系的运行时调试信息表,从而为实现面向程序设计语言的符号化调试提供了基础。
(1)目标地址到源代码的对应关系表;
(2)系统常量与内存地址的对应关系表;
(3)系统变量与内存地址的对应关系表;
(4)运行代码的标号与目标地址的对应关系表;
(5)汇编或运行过程中出现的错误信息表
其中,目标地址到源代码的对应关系可以由汇编以后生成的List文件和Obj文件来表示;系统常量与内存地址的对应关系表可由系统常量表中所保存的地址信息来建立;系统变量与内存地址的对应关系可由系统变量表中的信息来建立。另外汇编或运行过程中如果出现错误,调试器应能够到错误信息文件中进行查找并显示相应的错误信息。
建立这些联系表,并不是在运行时直接提供调试所需要的信息,从这一角度来看,应用程序调试环境必须对下列现象进行处理:
(1)程序运行的当前行显示;
(2)变量跟踪与变量内容显示;
(3)断点行显示;
(4)变量检查及修改;
(5)错误信息显示。
为解析上述现象,调试环境需要即时的取得模拟执行模块的执行状态,并取得各种寄存器的值、内存状态以及模拟执行的方式,再通过对各种联系表的处理来实现面向程序设计语言的调试。开发完成后的系统如图5所示。
5.结论
SI02IDE作为面向SI02语言的集成开发环境,将方便用户使用SI02语言进行各种开发工作。本文的创新点在于提高了软件开发的速度、效率和质量,使该软件成为软件开发最重要的和必不可少的开发工具。但该开发环境在功能上仍有一些缺陷和不够理想的地方。比如,对断点位置的处理不如主流IDE方便和直观,仍需进一步的改进和提高。
参考文献:
[1] 袁明,张连芳,董淼,赵宇.面向对象技术在嵌入式开发中的应用.计算机应用研究,2003(2):48~50
[2] 张海藩.软件工程导论(第三版)[M].北京:清华大学出版社,1998
[3] 陈定君,郭晓东,刘积仁.嵌入式软件仿真开发系统的研究.电子学报,2000,28(3):137~139
[4] 杨安祺,单振芳,杨竞澜.基于C/C++与ORACLE9i的嵌入式SQL编程技术.微计算机信息,2005(2),91~92
[5] 吕映芝,张素琴,蒋维杜.编译原理.北京:清华大学出版社,2002
[6] Beck Zaratian.Microsoft Visual C++ Owner’s Manual[M].Washington:Microsoft Press,New York,1999