时间:2023-05-30 09:27:09
开篇:写作不仅是一种记录,更是一种创造,它让我们能够捕捉那些稍纵即逝的灵感,将它们永久地定格在纸上。下面是小编精心整理的12篇汇编程序,希望这些内容能成为您创作过程中的良师益友,陪伴您不断探索和进步。
一、序言
近年来,随着C语言的进一步推广使用,绝大多数的工程师都倾向于使用C语言进行单片机系统开发,汇编语言由于可读性、通用性、可移植性差的原因,很难满足产品开发的需求。但是汇编语言具有执行效率高、占用内存空间小等特点,在某些应用领域还是具有无可替代的作用。
本文结合Keil μVision2程序开发流程,描述了51单片机汇编程序多文件编译的实现方法。通过多文件编译的使用,大大提高了汇编程序代码的可读性、可扩展性,同时也很大程度地提高程序代码的执行效率以及内存空间的使用率,避免内存空间的浪费。
二、Keil μVision2程序开发流程简介
Keil μVision2是美国Keil Software公司出品的51系列兼容单片机软件集成开发环境,该软件提供宏汇编器、链接/定位器、库管理器、调试器以及目标文件转换器等工具,是51单片机系统开发的首选工具。
Keil μVision2集成开发环境的编译流程如下:首先宏汇编器对汇编源程序文件进行编译,生成扩展名为.OBJ的目标文件和扩展名为.LST的列表文件,紧接着链接/定位器将所有的.OBJ文件进行绝对地址分配,链接生成包含绝对地址的目标文件和扩展名为.M51的地址文件,最后由目标文件转换器生成可用于编程器烧写、扩展名为.HEX的可执行文件。
三、汇编程序多文件编译实现
在Keil μVision2集成开发环境下,我们可以根据不同的硬件模块、功能模块分开编写应用子程序,进行模块化管理,实现多文件编译,这样就可以大大提高汇编程序代码的可读性、可扩展性。以下首先对段和模块的概念进行描述。
一个段可以是一块程序代码或者是一个数据块。根据其地址空间是否可以被链接/定位器更改,段可以分为可定位段和绝对地址段。在定义可重定位段的时候需要对其段名、类型及其属性进行定义。一个段可以分在不同的程序模块中,只要具有相同的段名,在编译过程中链接/定位器会把它们合并到一起。在定义绝对地址段的时候直接人为分配绝对地址,链接/定位器不能对改地址进行更改。绝对地址段没有段名,也不能给其他段结合。
模块是一个可以被单独编译的代码单元,可以包含一个或多个段或者部分段,一个模块既可以是单个文本文件,也可以通过INCLUDE指令把几个文本文件合并在一起。在程序编译过程中,汇编器会把一个模块编译为一个目标文件,也就是一个模块对应一个.OBJ文件。
根据以上对段和模块的描述,汇编程序的多文件编译可以通过以下三个方法来实现:
1、通过INCLUDE指令合并源文件
在代码编写时,通过INCLUDE指令可以将一个源文件插入到当前源文件中,这样汇编器在编译的时候就会将INCLUDE指令之后的文件合并到当前文件进行编译,生成一个扩展名为.OBJ的目标文件。INCLUDE指令的格式如下:
$ INCLUDE (文件名)
通过该方式实现多文件编译时,插入的源文件既可以是扩展名为.ASM的汇编源程序文件,也可以是扩展名为.INC的包含文件。注意在被包含的源文件结尾不能有END指令,否则编译会停止运行。
2、通过绝对地址段实现多文件编译
Keil μVision2中提供以下定义绝对地址段的指令,通过这些指令可以定义代码段和各种数据段,并指定其绝对地址。
由于绝对地址段在定义的时候对地址进行了分配,链接/定位器不能够对其地址进行更改,因此很容易造成地址重叠或者内存空间浪费,而且在后续对程序进行维护、升级的时候很有可能需要重新对地址进行分配,非常不利于程序的扩展和维护。因此绝对地址段通常是用在某些特定的场合,例如确定中断向量的入口地址、数据存储空间等。
3、通过可重定位段实现多文件编译
在Keil μVision2中,通过SEGMENT指令即可定义可重定位段。定义可重定位段时必须指定段的名称和存储类型,其格式如下:
四、总结
通过以上三种方式,均可以实现多文件编译,但是在实际使用过程中,INCLUDE指令通常用于包含特殊功能寄存器的定义等;绝对地址段则通常用于确定中断向量的入口地址、数据存储空间;而可重定位段的方式则广泛地用于各种代码段或数据段的定义。
通过多文件编译的方式,解决了单文件编译会导致程序文件过于臃肿、可读性差、不便于维护等缺点,大大提高汇编程序代码的可读性以及可维护性。
参考文献
[1] Keil Software. A51/AX51/A251 Macro Assembler and Utilities.2001.
一、C语言与汇编语言的混合编程方法分析
混合编程方法包括C语言调用汇编语言子程序、汇编语言调用C语言子程序和C语言程序嵌入汇编语言三种。第一,C语言调用汇编语言子程序需要遵循以下规则。一是根据参数顺序,依据反序顺序将参数压入堆栈中。二是依据参数的值进行传递;三是使用“EXTERN”对函数显示进行说明,函数名使用下划线格式的8个字符以内的名字命名;四是对代码段加以说明,并使用“—TEXT”作为代码段命名原则。五是汇编程序的参数取C程序的参数;六是汇编程序需要兼顾保护寄存器。基于以上6个原则,C语言与汇编语言混合编程时,汇编过程需要遵守规定的开头及结尾格式。第二,汇编语言调用C语言子程序则不需要改变汇编语言主程序和子程序的格式,只需主程序和子程序的格式保持一致,再开始前使用“EXTREN函数名”用于表明身份,表示该函属于调用C语言子程序的外部函数。第三,C语言程序嵌入汇编语言包括两种:一是C程序调用汇编子程序模块和C程序嵌入汇编指令两种。C程序调用会汇编子程序模块需根据主程序和模块编写语言确定,如果主程序为C语言、模块为汇编语言,则需要使用C程序调用汇编子模块。C程序嵌入汇编指令主要用于处理C语言无法控制硬件的情况。例如修改中断标志寄存器、重复使用某种功能可采用C语言嵌入汇编指令的方式实现。
二、C语言与汇编语言连接的关键问题要实现
C语言与汇编语言之间的连接还需要解决参数关系、确定调用关系和模块连接三个问题。参数关系是混合编程过程中必须解决的问题,多数程序员均采用堆栈方式解决参数传递问题,具体操作为:以汇编语言中的BP作为机制寄存器,以反序多为调用顺序,将C语言中的参数压入堆栈中,且BP根据参数加入相应的偏移量即可实现参数使用。而确定调用关系则需要说明要调用的函数或过程,并确定调用及其调用关系。外部模型可调用被调用的函数或被调用过程,调用程序需说明被引用的外部模块的名称。实现汇编程序与C程序模块连接需要保证不同语言模块的存储模式相同以及遵守C兼容的函数及变量命名约定。
三、结语
随着计算机技术的提高及计算及应用范围扩大,许多领域的控制工作都得到极大的简化,而且C语言这一高级程序设计语言的应用也愈加广泛,丰富了计算机软件的功能及内容。然而,信息技术始终处于不断发展状态,人们对计算机软件编程的要求也在逐渐提高,程序员仍需要深入了解C语言的特性,强化C语言运用,利用C语言实现计算机软件的多功能,不断创新和开发信的软件。最后,程序员还需要合理运用C语言和汇编语言进行综合编程,简化软件编写过程,提高软件使用效率。
作者:芮素文单位:安徽国防科技职业学院
关键词:汇编语言源程序;汇编;Debug 调试
汇编语言作为一种介于机器语言和高级语言之间的程序设计语言,有其独有的特点和应用场合。用汇编语言编写的解决应用问题的程序称作汇编语言源程序;将汇编语言源程序翻译成机器语言程序的软件称作汇编程序;将汇编语言源程序翻译成机器语言程序的过程称作汇编。汇编语言源程序上机运行需要MS-DOS操作系统的支持,也可运行在Windows 98以上的MS-DOS环境中。
二、汇编源程序
用编辑软件建立的源程序.asm文件,必须经过汇编才能产生.obj文件。
本步骤最需要注意的问题就是所用的masm汇编程序和编辑好的汇编语言源程序的路径,只要不在默认目录下的都要输入他们的实际路径,为此需键入:”e:\masm\masm 123”,因为汇编语言源程序123.asm已经保存在默认目录C:\Documents and Settings\Administrator下,就不用输入详细路径,而汇编程序masm不在默认目录下,故需要输入该程序所在的详细路径e:\masm\masm,如下图所示。
以上信息中方括中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按回车键。
汇编后生成以下几个文件:
(1).OBJ文件是汇编产生的目标代码文件,当源程序中无语法错误时,则在默认目录下自动存入一个.OBJ文件,供下一步连接用。若源程序有语法错误时,会出现错误信息提示,如上图所示。
(2).LST文件是列表文件,它将源程序中各语句及其对应的目标代码和符号表以清单方式列出,对调试程序有帮助。
(3).CRF文件(交叉引用文件),交叉引用.CRF文件给出了源程序中定义的符号引用情况,按字母顺序排列。
三、 连接目标程序
汇编产生的.OBJ文件,组成该文件所有目标代码的地址都是浮动的,机器不能执行。必须用连接程序LINK对其进行连接定位,产生.EXE可执行文件,方可运行。该步骤和上一步有同样需要注意的路径问题,输入连接程序LINK的实际路径,需要连接的.OBJ文件在默认目录下,可不用输入路径。
连接后生成两种文件:.EXE和.MAP
(1).EXE文件是可执行文件,若采用方括号中默认的名字,直接按回车键,否则需重新输入一文件名。若连接过程中无错误,则自动在当前默认目录下生成.EXE文件。若有错误,则会给出错误信息提示,这时必须重新修改源程序,再汇编、连接。
(2).MAP是连接映像文件,.LIB库文件,连接程序询问是否使用某种库文件,不需使用库文件直接按回车键。
四、运行程序
连接后生成的.EXE文件存放在当前的默认目录下,在DOS环境下直接键入文件名即可运行。
结论
总体上说,要掌握汇编语言源程序上机运行的操作过程,还是应该理解每一步骤的作用及原理,理解后就知道为什么要这样操作,该注意哪些问题,发生错误该怎样改正。因此汇编语言的学习不只是理解它全部的指令含义,还要理解它上机运行的原理。通过学习汇编语言,能够加深对计算机原理和操作系统等课程的理解;能够感知、体会和理解机器的逻辑功能,也为理解各种软件系统的原理,打下技术理论基础。
参考文献
关键词:汇编语言程序设计; 教学方法; 内联编程
1课程的现状
汇编语言不同于其它高级语言,必须要求编程人员有一定的硬件基础,如对CPU的结构、CPU与存储器等部件的数据传送过程必须要有基本的了解,这样才能学好这门课程。在教学过程中,我们发现学生对高级语言编程学习积极性高,对汇编语言课程缺乏兴趣,因为课程本身指令复杂,规定繁多,再加上学习汇编指令前对CPU的相关工作过程理解不透,导致学生厌学,又由于本课程面对的低年级学生只有高级语言的基础,习惯于高级语言的自然表达,初次接触计算机硬件知识心理上有恐惧感,更难以适应繁杂的低级语言。
针对本课程的特点,对教学内容、环节、过程等进行了精心设计,下面就教学方法的设计、实践教学方法、课程考核形式等方面进行的一系列改革进行详细探讨。
2教学方法设计改革
为了避免学生因指令复杂,规定繁多、难度大而对该课程产生畏惧的学习心理,教师有必要对教学内容进行合理组织,对教学过程进行精心的设计。
2.1利用FLASH技术,使教学难点容易理解
在多年的教学过程中,我发现学生在学习CPU结构这章节中,对介绍的CPU由哪些寄存器(名称、大小)构成,各个寄存器的含义,用途,CPU与存储器等部件的数据传送过程,会觉得很抽象,多数同学都是采用死记硬背的方式,这章节是第二章节的内容,也是能否学好该课程关键的一章,如果理解不深,这无疑为后续的学习,特别是寻址方式的学习埋下了隐患。
针对这个问题,教师有必要对教学过程进行精心的设计。
在这章节中我们利用FLASH技术,把各种寻址方式下传送指令的CPU与存储器等部件的数据传送过程以动画形式展现给学生,使得复杂,抽象的过程变得直观,学生理解比较容易,也加深了对寻址方式的记忆。
2.2对比法教学
目前计算机专业的课程设置中,《汇编程序语言的程序设计》课程通常是学习完C语言课程之后开始学习的。所以在教学中可以采用对比法来讲解课程,对某些语法知识点和程序设计过程我们可以以C语言和汇编语言对应分析。
例如在介绍寄存器时,由于在一般的c语言程序中并没有直接使用到寄存器。因此,我们使用vC++6.0环境下的调试工具显示一个c语言程序及其对应的机器码,让学生看到编写汇编程序寄存器的用途,加深了学生对汇编语言程序的理解。
int m=5,n=6,c;
004010E8 mov dword ptr [ebp-4],5
004010EF mov dword ptr [ebp-8],6
c=m+n;
004010F6 mov eax,dword ptr [ebp-4]
004010F9 add eax,dword ptr [ebp-8]
004010FC mov dword ptr [ebp-0Ch],eax
在介绍语法知识时,比如变量的定义:
C语言中的变量定义形式如下:
int c1,c2=0;
汇编语言的变量定义形式如下:
cl DW ?
c2 DW 0 转贴于
2.3抽象概念的比喻教学法
在对段地址和偏移地址的讲解过程中,可以采用比喻法,把操作数比喻成学生,把教室的房间号比喻成段地址,教室内每个座位编个号,编号就是偏移地址,要想到教室把某个学生找到,就要找到相应的教室号,再到对应的座位号找到这个学生,同理,要想把主存中的操作数找到就要找到段地址和相应的偏移地址,另外要让学生知道每个教室里的座位号都是从0号开始编号的,也就是每个段里的偏移地址如果不特别指定,也是从0号开始编号的。
3实践教学改革
3.1增强实验环节,做一些实际项目
程序设计对于大多数的初学者来说有一定的难度。对于给定的一个实验题目,许多学生往往感到无从下手。目前的上机实验时间往往很短,常常是学生才刚刚有点入门,实验环节就结束了;且课外实践环节几乎没有,导致学生即使课内学的再好也不会应用。
在实验设计方面可以先把一些经典的程序提供给学生,例如分支结构的设计、循环结构的设计等,让学生在写出C语言程序之后再设计汇编程序,找出两者编程思维的区别。这样通过一段时间的经验积累,就能够编写比较复杂的的程序,由于上机时间有限,可以每次实验课之后布置一些题目供学生选择思考,让学生课外分组来设计这些程序,题目的类型可以是研讨型的让学生从更多的角度去思考上机实验过的题目,编写出不同的程序;另一种为编程型,
例如可以设置这2道题目,音乐小键盘、贪吃蛇游戏等,以加强同学们的编程能力的训练。
3.2采用与高级语言混合编程
目前越来越多的场合要使用汇编语言和高级语言进行混合编程,因此在教学时应强调汇编语言和C/C++的混合编程,并且这样也可以为今后嵌入式系统软件开发的学习打下坚实的软硬件基础。
在实验课中可以借助 Visual C++开发工具,采用内联汇编的方式,在 C/C++源程序中嵌入汇编指令序列完成一定的功能,并让学生设置断点然后跟踪执行,同时注意观察寄存器的内容和变量的值。这样可以一方面让同学们熟练掌握两种语言的切换使用,另一方面让他们感受到两种语言各有特点。例如可以利用汇编语言处理高级语言中不方便处理的一些问题。
4课程考核形式改革
因为“汇编语言程序设计”是实践性很强的一门课程,所以实验课成绩应该在总成绩中占有相当大的比重。目前大多数高校的汇编语言课程的实验课成绩只占很小的比重,即理论知识往往占课程期末考核总成绩的70%~80%,这样往往会导致学生不得不将大量的精力放在理论知识的学习中,结果只会造就大批的应试高手。在教学中,我们遇到过有的学生考试试卷能考90分以上,却连最基本的计算机操作都不能动手。今后这门课程的考核,实验课成绩应该提高到占总成绩的1/2。老师在实验中应该营造出互动气氛,检查每个学生的完成情况同时做好记录,根据学生的实际动手情况给出他们的平时实验成绩,而不是只依据交上来的实验报告,这样也能杜绝抄袭之风。
5结束语
通过教学改革的实践,在一定程度上提高了他们对本课程的学习积极性,又降低了学习难度。良好的教学效果是永远追求的目标,在今后的教学中,我们还需要不断进行探索、研究和尝试,不断更新观念,发现自身教学过程中的问题,找到解决办法,提高教学效果。
参考文献
[1] 王成耀.80x86汇编语言程序设计[M].北京:人民邮电出版社,2008(第2版).
[2] 卜登立,彭嵩松,唐卫东,龙侃.“汇编语言程序设计”课程教学改革研究与探讨[J].井冈山学院学报,2009,30(10):124-127.
【关键词】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 向前跳转地址
关键词:汇编语言程序设计;教学改进
中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)09-2111-02
Teaching Thinking of Assembly Language Programming Course
LUO Xing
(Hanshan Normal University, Hanshan 521041, China)
Abstract: This paper discusses the problem appear in teaching of assembly language programming course, propose some methods to improve student's ability to master the knowledge and learning interest. Discuss the assembly language teaching in Win32 platfrom in the last.
Key words: assembly language programming; teaching improvement
1 汇编语言程序设计课程教学现状
汇编语言程序设计作为一门计算机专业的课程,其存在的合理性在近年受到争议。有些人认为,汇编语言作为一种低级语言,指令繁多,难以掌握。另外,编程效率也不高,一个高级语言用一条语句实现的功能,在汇编语言中需要很多条指令才能实现。此外,汇编语言在时间上和空间上的优势由于高速CPU和大容量存储器的出现,也变得意义不大。
我认为学习汇编语言仍然具有重要意义。可以归纳如下:
1) 可以比较深入了解计算机硬件的底层工作原理,例如:CPU的工作模式,寄存器的概念,内存的寻址方式,中断的工作原理等。
2) 熟悉各种数据表示方法。如各种数制的转化,各种类型的数据在内存中的存储方式。学生在系统学习汇编语言程序设计这门课程后,对二进制,十进制以及十六进制相互间的转换应该非常熟练。对数据在内存中两种排列方式即大端方式(Big Endian,低地址存放高位字节)与小端方式(Little Endian,低地址存放低位字节)有清晰的理解。而这些相关的概念的牢固掌握对高级语言中的数据类型以及计算机网络编程的学习具有很大的帮助。
3) 通过汇编语言编程学习,可以促进对高级编程语言相关概念的理解。高级语言在编译的时候,一般都是先生成汇编代码,然后再生成的二进制代码。所以,通过对比分析汇编代码与高级语言代码的实现方式,对程序的执行效率,数据在内存中存放方式,堆栈的概念,函数的调用及参数传递的方式等都会有进一步的了解。
在教学中,我也遇到一些问题。一方面就是学生的积极性不高。主要原因包括:指令很多,难以记忆。对于几个大类的指令,如果每次课上一类,学生课后如果不进行主动复习,往往到下一次课的时候,就会忘记前面所学的内容或者发生混淆。另外,在学习汇编课程之前,他们已经学过一门高级语言,如C/C++等,汇编语言的学习方式与高级语言的学习方式有所不同,高级语言比较容易上机练习,也容易对程序运行结果验证,对于开发实用软件也相对容易,所以学生的兴趣比较大。而汇编语言一方面涉及到底层的硬件概念,比较难以理解,另一方面上机也比较困难,可以这么说,如果按照课本的顺序讲课,要到差不多讲完课,学生才可以上机完成一个功能比较完整的程序。
2 促进学生对知识的掌握
要解决这些问题,我认为要在学生的知识掌握方式以及学习兴趣的培养上下功夫。对于知识的掌握,除了每次新课内容讲完后,精心给学生布置作业习题之外。还应该注意到由于汇编语言的指令及相关的知识点很多,对于刚接触这门课程的学生一开始往往不大适应,容易混淆前面学过的内容,所以教师及时对所学过知识点进行比较和总结就很有必要。此外还应该定期对学生的学习效果进行检测,从过去的教学经验看,汇编语言这门课程是学生比较容易与教师的教学进度脱离的一门课程,不少学生在一开始由于在掌握知识遇到困难,问题越积越多,最终可能放弃听课。在检测的方法上,可以借助网上考试系统。教师可以自主出题,也可以让系统自动出题。通过分析学生的测试结果,教师可以及时调整教学进度,学生也会有一定的学习压力,使他们花更多时间查补缺漏的知识。
程序设计学习的最佳方法就是上机实践。汇编语言上机练习跟高级语言的上机练习相比,对于学生来说比较困难。一方面是由于一个完整的汇编程序涉及的知识点很多,而教材往往按知识点分类进行编排。所以学生要想在刚开始学习阶段,就编出完整的程序有一定的难度。另一方面,汇编程序的运行结果较难在屏幕上输出,汇编语言只有字符与字符串的输入输出,对于一道简单的算术运算题目,其结果的输出都要通过一大段的转换程序来实现。对于第一个问题,教师可以对教材内容进行选讲,把实验所涉及到的知识点先进行讲解。对于第二个问题, 我认为应该重点培养学生熟练使用调试工具的能力,通过掌握调试工具如DEBUG,CV等的使用,一方面学生可以直接观察程序的运行结果,另一方面,对于程序的逻辑错误也可以进行跟踪、分析以及解决。此外,由于汇编语言作为一种低级语言,编程都由一条条指令进行构造,所以相对繁琐,应尽早让学生应用模块化思路,掌握子程序及宏的使用方法。这样把一些常用功能做成模块,如输入输出功能,以后学生在编程的时候就可以直接调用这些模块,从而专注于实验的其它方面。
3 提高学生的学习积极性
对于如何提高学生的学习兴趣,我认为主要让学生意识到汇编语言的作用。一方面可以引入一些接口技术相关内容,使学生熟练掌握中断的概念以及I/O指令,然后上机编写中断程序,在中断控制器(8259A)进行验证,由于这些实验有按键输入,有屏幕输出,还能直接看到程序控制设备的效果,所以学生兴趣会比较大。此外,教师也可以适当拓展一些知识,如嵌入式编程相关概念,有兴趣的同学可以在课后自主进行学习。另外,由于不少学生对硬盘相关的问题感兴趣,比如硬盘数据的存放方式,数据的修复等。可以引导学生对这些问题进行思考,然后通过汇编语言提供的I/O指令和中断子功能,编程实现对硬盘的MBR,文件分配表等数据结构的读取,备份,修复等功能。教师通过布置一些学生比较感兴趣的课外作业,并适当提供协助,往往能提高学生的学习积极性。
另外,在汇编语言的学习过程中,教师应该有意识引导学生将汇编语言与高级语言的各个对应的部分进行比较。学生在学习汇编语言之前,通常已经学过一门高级语言,如C/C++等。高级语言在编译的时候,一般是先转换成汇编代码,所以它们具有相通性。大部分学生编写应用程序的时候是用高级语言,所以通过比较分析高级语言与低级语言在数据定义,程序流程控制,函数的定义及调用等的对应部分内容,对于学生更好的使用高级语言编写程序是很有帮助的。比如:汇编语言里有分段的概念,一般把变量定义到数据段,把代码定义的代码段。而C语言是把数据与代码都定义在一起,那么C语言编写的程序在编译成可执行文件后,它的全局变量,局部变量的空间是如何分配的。另外,对于动态内存分配,堆与栈的区别在哪里。还有函数的定义与调用,参数的传递顺序是如何的?这些疑问,都可以让学生编写简单的C语言程序,生成可执行文件后,然后通过调试工具进行反汇编进行分析。此外,在利用VC++,Dephi等IDE开发工具进行程序编写时,都会用到里面的调试功能。基本上调试功能都会包括反汇编与内存查看的功能,教师可以引导学生进行这方面的训练,使他们在以后编程时能熟练应用这个工具解决一些疑难问题,例如:内存非法访问,指针的非法引用等。
4 Win32平台下的汇编语言教学思考
目前很多高校在汇编程序设计教学中讲解的是8088/8086 CPU实模式环境,实际上是虚拟8086模式,因为真正的实模式工作DOS下,而现在汇编语言实验环境都是在windows 2000以上。由于现在大部分CPU都是32位以上,并且是工作上保护模式之上,此外这些CPU的寄存器类型以及寻址方式都已经发生较大变化。所以教师有必要对实模式与保护模式在逻辑地址转化为物理地址的方式的差异,还有16位与32位的指令在用法的不同点进行重点讲解。因为汇编语言现在的实际应用基本上采用工作于保护模式的Win32平台,在Windows操作系统控制下,汇编语言虽然不能再直接存取硬件,但是能通过调用系统提供的API函数完成各种功能。其实这里的API函数当于DOS下的中断调用,但是Window API函数无论从数量上、功能上还是易用性上都大大超过了DOS或BIOS的中断调用功能。所以现在在Win32平台下,汇编语言就像高级语言一样,可以方便的开发各种Windows应用程序。有些教师认为,既然在实模式讲解汇编语言很少涉及实用性,那就应该直接迁移到Win32汇编平台,讲解用汇编语言开发的Windows应用程序设计实例,从而提高学生积极性。我认为如果采用这种教学方法,可能会存在以下问题:首先由于上课时间有限,学生需要大量的时间才能熟练掌握各类指令,汇编语言的语法,程序结构等方面的知识。如果过多涉及Windows程序设计实例,对于不熟悉Windows编程机制的学生的来说,又多了一个不小的学习负担,这样子反而影响了汇编语言基础知识的掌握。另外,DOS下的实模式与Window下的保护模式下的编程在本质上并无很大的区别,只要学生熟练掌握各类指令用法,理解16位与32位的指令及寻址方式的区别,逻辑地址与物理地址转换机制等知识,他们就可以通过自主学习,较容易的掌握用汇编语言进行Win32应用程序的开发。对于教师,除了帮学生打好汇编语言的基础,可以适当以课外作业的形式,引入一些汇编语言在不同应用领域的简单实例,如加密与解密,软件的逆向工程等,这些课外作业的完成对学生汇编语言的应用能力的提高将会有不小的帮助。
5 结束语
汇编语言难教难学是教师与学生的共识,但是作为计算机科学中一门低级程序设计语言,通过对它的良好掌握,确实可以促进对计算机软硬件底层的了解,而这又能促进编程能力的提高。作为教师,在教学中应该不断尝新的教学方法,不断积累经验,只有这样,才能把这门课上好。
参考文献:
1.1从知识点讲授到以系统设计为主线的教学改革
我国高校在2世纪8年代初开始在少数高校开设单片机课程,面向电子和计算机专业高年级本科生和研究生,教材内容基本是单片机生产商提供的技术手册、汇编程序设计和计算机原理与接口技术的综合体。目前单片机教材虽然较多,但基本延续了这种传统的教学思路,即以单片机的知识点为主线进行单元技术教学。随着单片机教学在各层次学校的广泛普及,这种教学思路显现了明显的不适应。系统设计性内容缺失和细节内容深度不够,使一般学生在实际应用过程中仍然会遇到许多迷茫的问题。目前单片机基础课教材的一个普遍性的问题是教学集中在分散的各个点,而对单片机系统整体结构性考虑不够;重在局部和单元模块,缺乏组织成项目的考虑。这种问题严重地体现在系统软件设计中,一般学生会做例题和作业,不会设计解决实际任务的系统软件。因此,单片机基础课程教学改革的一个重点就是从知识点讲授到以系统设计为主线,基于课程整体性并结合项目系统整体性考虑实施单元教学,重点提升学生系统性、综合性设计能力。
1.2单片机与其它课程教学形成良性互动
在目前课程体系中,考虑到知识衔接关系,单片机课程在模拟电子技术、数字电路、计算机组成(微机原理与接口)、汇编程序设计等课程之后,一般安排在第6学期。这个安排的问题是学生实际综合应用及拓展学习的时间较短。这在单片机进入我国高校的早期阶段仅高端学生学习的情况下是合理的,在目前单片机普及教学情况下,作为工具和重要的学科基础课,单片机课程应尽早让学生掌握,对其熟练和提高系统设计能力、提高学习兴趣、结合和促进其它课程学习将产生良好作用。单片机基础课程涉及到的模拟电子技术、数字电路等知识,是相对简单的,在课程中从应用的角度介绍即可,对单片机课程的教学没有影响。实际上,有些同学从大一就开始自学单片机而且都取得了很好的效果,这对我们教学是一个很好的启示。
【关键词】 单片机;PC机;串行通信;VB6.0;汇编程序
随着科学技术的发展,在单片机应用系统的设计中常常遇到计算机与外界的信息交换,即通信。鉴于PC机具有强大的监控和管理功能,单片机具有快速以及容易控制的特点,在实际应用中,一般都利用PC机所配置的RS-232C标准串行接口来实现应用系统与PC机之间的数据交换。Visual Basic 6.0(简称VB6.0)在通信方面提供了专门的Communications控件,即控件Mscomm,可以完成简单的串行端口通讯功能,也可以用来创建功能完备、事件驱动的高级通讯工具。可以利用VB6.0的Mscomm控件来实现PC机与多台MCS-51单片机之间的串行通信。该控件提供了一系列标准通讯命令的使用接口,利用它可以建立与串行端口的连接,并通过串行端口连接到其它仪器设备,从而发出命令、交换数据、以及监视和响应连接中发生的事件与错误。
一、系统结构设计
本系统是由一台上位PC机和若个台以M CS-51单片机为核心的下位机构成。大多数PC机都配备有串行通讯端口RS-232C,用于两台计算机间进行串行通讯,但单片机的输入、输出电平为TTL电平,与PC机的RS-232C标准串行接口的电气规范不一致,要实现单片机与PC机之间的数据通信,还必须进行电平转换,在上位PC机与下位机的连接中采用RS-232C/RS-485转换器,将PC机串口的标准由RS-232C电平信号转换成RS-485的差分信号。RS-485具用“平衡差动式”的数据传输特性,工作于半双工方式,RS-485的串行通信线路可采用最普遍的双绞线,且在抗干扰能力和带负载能力方面较其它的串行接口标准有非常明显的优势,适用于高速率和远距离的串性通信场合。PC机与多个单片机通信的电路结构图(如图1所示)。
图中的下位机是以MCS-51为核心的单片机系统,该系统由一片MCS-51外加一片256K的Eprom组成,并由芯片构成系统数据输入功能块、电机驱动功能块、数据输出功能块和通信功能块,其中通信功能块可选择下列三种通信方式之一,即由74LS245芯片构成的并行通信方式、由MAX232芯片构成的RS-232C串行通信方式以及由75176芯片构成的RS-485串行通信方式。
图1PC机与多个单片机通信的电路结构图
二、PC机的程序设计
VB6.省略mport=1 ;设置通讯端口号为com1
Mscomm1.setting=’1200,N,8,1’ ;设置为字符串形式,波特率为1200,无校验位,8位数据位,1位停止位
Mscomm1.portopen=tu re ;打开通讯端口
(2)连接和发送缓冲区的属性设置
Inbuffersize=256 ;接收缓冲区为256个字符
Outbuffersize=2 ;发送缓冲区为2个字符
Rthreshold =6 ;每当缓冲区收到6个字符就产生oncomm事件
Sthreshold=1 ;发送缓冲区为空触发事件
Inputlern=0 ;读取接收缓冲区所有字符
(3)主程序清单
Private sub commandl_click()
Textl.text=’检查下位机的连线’
Endsub
Private sub command2_click()
Comml.Output =chr(49)
Textl.text=’1#’ ;1号下位机
Endsub
Private sub command3_click()
Comml.Output =chr(50)
Textl.text=’2#’ ;2号下位机
Endsub
Private sub command4_click()
Comml.Output =chr(51)
Textl.text=’3#’ ;3号下位机
Endsub
Private sub command5_click()
End
Endsub
Private sub comm1.省略mevent
Case comEvReceive
Dim data(100)as string
Data num>=comml. input
k=data(num)
Textl.text=k
Endselect
Endsub
三、单片机的程序设计
下位机中关于RS-485的串行通信部分采用MCS-51系列单片机的汇编语言编写。MCS-51系列单片机有一个标准的全双工串行接口,其串行控制寄存器SCON包含串行工作方式选择位、接收发送控制位以及串行口状态标志位。SCON在单片机中的地址为98H。假设MCS-51单片机从外部采集到的一组30个的数据,并存在片内RAM 20H~3DH区域中,现要求将这个数据块传送给PC机。为了保证传送的正确,在传送前应由单片机先向PC机发送联络信号#55H,PC机准确接收到后,向单片机发送回应信号#0AAH,在检验无误后,单片机才开始向PC机传送数据。对串行口的操作可分为以下四步进行:(1)串行口初始化;(2)发送联络信号;(3)接收回应信号;(4)发送数据。
汇编程序代码如下所示:
ORG0030H
START: MOVSP, #60H
MOVTMOD, #20H ;Tl工作在模式2下
MOVTH 1, #F3H
MOVTL1, #F3H ;波特率设置为1200
SETB TRl
MOVPCON, #00H ;SMOD=0
MOVSCON, #50H ;选择串行方式1
MOVR0, #20H
MOVR2, #30 ;数据个数
XX1: MOVA, #55H
MOVSBUF,A ;发送联络信号
WAITl: JBCT 1, W AIT2 ;等待发送完毕
AJMPWAIT1
WAIT2: JBC R1, READ ;等待接收完毕
AJMPWAIT2
READ:MOVA, SBUF ;接收联络信号
CJNEA,#0AAH, XX 1 ;接收数据不正确,重新开始
LOOP:MOVA,@R0
MOVSBUF,A
WAIT:JBC T1, LOOP1 ;等待发送完毕
AJMPWAIT
LOOPl:JNCR0
DJNZR2, LOOP
END
在VB6.0下实现串行通信有多种方法,除利用Windows API函数和利用Mscomm ActiveX控件外,还可通过VB调用动态链接库dll来实现,本文只介绍了如何利用Mscomm控件来实现串行通信。当前,基于VB6.0的PC机与单片机的串行通信技术在我国发展已比较成熟,应用也比较广泛。
参考文献
[1]陈立元.Visual Basic与RS232串行通信控制.北京:清华大学出版社,2002:48~51
[2]李朝青.PC机及单片机数据通信技术.北京:北京航空航天大学出版社,2000:177
[3]胡汉才.单片机原理及系统设计.清华大学出版社,2003
关键词:机械类专业;微机原理与应用;教学改革;教学质量
Teaching reform and practice of principle and its applications of microcomputer for mechanical specialties
Wang Hongru, Tang Wei
Jiangsu university of science and technology, Zhenjiang, 212003, China
Abstract: To improve teaching quality of principle and its applications of microcomputer in mechanical specialties, characteristics and present situation of the course are analyzed thoroughly, and then a series of improvement strategies of teaching contents, teaching methods and means, and practice link are proposed. Results of teaching practice indicate the proposed strategies can stimulate the students’ learning interest and can exploit their learning potentialities. And teaching effect is improved consequently.
Key words: mechanical specialties; principle and its applications of microcomputer; teaching reform; teaching quality
微机原理与应用是我校机械类专业的一门专业基础课,主要讲授单片机硬件知识、汇编语言程序设计方法和单片机应用系统的设计[1]。对学生而言,课程内容比较抽象、知识点多,学习难度大;对教师而言,由于计算机的快速发展而需要不断更新、补充教学内容,但学时却在不断减少。因此,结合微机原理与应用课程的特点及现状,研究提高教学质量的方法和思路具有重要的现实意义。
1 课程特点及现状
我校机械类本科专业对微机原理与应用课程的基本要求是学生熟练掌握单片机技术,并初步具备单片机应用系统的设计开发能力。因此要求该课程的教学必须既重视理论知识的传授,又要加强实践、创新能力的培养。
1.1 内容繁杂,概念抽象
微机原理与应用课程的主要内容有单片机的基本组成、工作原理、接口电路、汇编程序设计,以及单片机应用系统的设计等[1],其中每一部分都包含诸多知识点和抽象概念。例如半导体存储器部分,包含的知识点有半导体存储器的分类、特点、性能指标、基本结构、ROM和RAM的基本工作原理、片选信号产生方法、常用存储器芯片引脚功能,以及外存储器扩展的基本方法等;涉及的主要概念有ROM和RAM、片选线和片内地址线、地址总线和地址引脚、字选和片选,以及基本地址范围和重叠地址范围等,这些概念均比较抽象,理解起来有一定的难度。
1.2 学时较少,内容更新快
机械类本科专业由于其自身的特点,分配给微机原理与应用课程的学时本身就较少,再加上近年来随着国家对人才需求的变化,修订后的教学培养计划几乎每门课程的教学时数都在减少[2]。另外,随着计算机技术的快速发展,教学内容也需要不断地更新、补充。
1.3 学生学习兴趣普遍较低
由于单片机的工作原理看不见、摸不着,且汇编语言是面向机器的语言,再加上机械类专业学生的电路以及计算机基础相对比较薄弱,因此学生感到抽象、枯燥,多数学生的学习兴趣较低,学习主动性不强。
通过上述分析可以看出,如何在有限的时间内将如此繁杂的内容高效传授给学生,并培养他们的创新能力,成为提高微机原理与应用课程教学质量的关键。
2 教学改革
为提高微机原理与应用课程的教学质量,笔者从教学内容和教学方法与手段两方面提出一些有针对性的改革措施。
2.1 教学内容改革
目前,国内高校的微机原理与应用课程大多是以Intel 80x86系列或MCS—51系列单片机为主要教学内容,也有采用其他类型中央处理器的单片机的。虽然处理器类型不同,但是介绍的主要内容基本相同。我校机械类专业微机原理与应用课程是以MCS—51系列单片机为主要内容组织教学。然而,近年来随着计算机技术的快速发展,出现了高性能嵌入式中央处理器,这对教与学而言均是一个较大的挑战。因此,如何处理好教学内容与实际应用之间的矛盾,成为微机原理与应用课程教学改革亟待解决的问题。
2.1.1 紧扣教学大纲,精选教材,优化教学内容
1.1从知识点讲授到以系统设计为主线的教学改革
我国高校在20世纪80年代初开始在少数高校开设单片机课程,面向电子和计算机专业高年级本科生和研究生,教材内容基本是单片机生产商提供的技术手册、汇编程序设计和计算机原理与接口技术的综合体。目前单片机教材虽然较多,但基本延续了这种传统的教学思路,即以单片机的知识点为主线进行单元技术教学。随着单片机教学在各层次学校的广泛普及,这种教学思路显现了明显的不适应。系统设计性内容缺失和细节内容深度不够,使一般学生在实际应用过程中仍然会遇到许多迷茫的问题。目前单片机基础课教材的一个普遍性的问题是教学集中在分散的各个点,而对单片机系统整体结构性考虑不够;重在局部和单元模块,缺乏组织成项目的考虑。这种问题严重地体现在系统软件设计中,一般学生会做例题和作业,不会设计解决实际任务的系统软件。因此,单片机基础课程教学改革的一个重点就是从知识点讲授到以系统设计为主线,基于课程整体性并结合项目系统整体性考虑实施单元教学,重点提升学生系统性、综合性设计能力。
1.2单片机与其它课程教学形成良性互动
在目前课程体系中,考虑到知识衔接关系,单片机课程在模拟电子技术、数字电路、计算机组成(微机原理与接口)、汇编程序设计等课程之后,一般安排在第6学期。这个安排的问题是学生实际综合应用及拓展学习的时间较短。这在单片机进入我国高校的早期阶段仅高端学生学习的情况下是合理的,在目前单片机普及教学情况下,作为工具和重要的学科基础课,单片机课程应尽早让学生掌握,对其熟练和提高系统设计能力、提高学习兴趣、结合和促进其它课程学习将产生良好作用。单片机基础课程涉及到的模拟电子技术、数字电路等知识,是相对简单的,在课程中从应用的角度介绍即可,对单片机课程的教学没有影响。实际上,有些同学从大一就开始自学单片机而且都取得了很好的效果,这对我们教学是一个很好的启示。
2单片机理论教学的改革
单片机教材最初源于单片机生产厂家技术手册、汇编语言程序设计和计算机组成与接口技术的综合。单片机应用初期面向对象是重点院校电子和控制专业的学生和科研人员。传统的授课方式是以知识为驱动,知识点之间比较分散,学生学完之后没有系统的概念,缺乏贯穿所有知识的主线,形成不了体系。这种教学方法亟待改革。
2.1以项目为主线
系统结构性设计是一个重要的教学内容。从宏观教学的角度考虑,我们将整个教学内容设计成基本涵盖了本课程全部教学内容的一个项目,基于课程整体性并结合项目系统整体性考虑实施单元教学。对结构性的适当变化和局部内容的取舍,即可衍生和变化为其它的应用系统。通过这样的教学设计,学生加大了对课程的兴趣,逐渐地积累成就感,并最终能较快地进入系统设计者的角色,能较好地完成实际应用系统的设计。
2.2整体与局部关系
基于项目为主线的教学设计,在讲述局部技术的同时进行系统结构性的教学,使系统整体性的考虑体现在局部中。例如LED数码管动态显示、步进电机驱动等技术,在目前教材中基本都是完成单一这类功能的小程序,而在实际应用系统中,这些功能要与系统核心任务并行执行,是一个“多任务”的概念,不能简单地将教材示例的单一的小程序搬到应用系统中。其它如结合键盘扫描和多级LCD菜单形成多任务下的人机交互通道这些系统性内容的考虑,在单元教学中都要考虑到。
2.3教学内容和体系调整
调整应用汇编和C语言教学的比例。汇编指令有助于对单片机硬件的学习,程序代码短、速度快,较多地应用在对时序有严格要求的测控系统中。随着单片机硬件和软件编译技术的发展,代码长度和速度已不是主要问题,重在软件质量、开发周期和开发维护成本,大多数场合应用汇编的必要性已不存在。因此教学应以C语言为主,汇编只讲解指令原理、寻址方式、必要的指令和在C语言中嵌入汇编程序的方法和实例。调整单元模块教学顺序。现有教材中一般将人机交互设计的内容放在最后,这不利于学生自主实践。由于无法实施对运行过程必要的监测,使其在没有仿真系统情况下调试有相当的难度。因此,将人机交互部分尽可能地提前可达到很好的效果。单片机基础课程传统教学对新机型和新技术介绍较少,应做适当的补充。增加IIC、SPI、PS/2等相关技术和应用的介绍、对其它典型单片机如AVR简要的介绍,使学生在掌握基本单片机技术基础上,能更容易地进入到高级层次的应用。
2.4挖掘基本知识内容的深度
把MCS-51单片机基础知识讲透彻,对后续嵌入式系统深层次学习可打下良好的基础。以外中断的重复响应和堆栈的溢出问题为例,学生在实际应用中经常遇到,但在教材中没有相应的说明。前者是由于外中断请求信号有毛刺,即使在进入中断立即屏蔽中断,且中断请求信号已经撤销的情况下,在退出中断后还将引起此中断的重复响应。问题在于对中断请求信号、请求标志和响应过程这些基本知识讲述不到位;后者是对堆栈空间位置、容量及系统对堆栈使用没有准确概念。类似的因基本知识讲述深度不够,导致学生困惑的问题还有很多。因此要注重研究实际应用中典型问题背后的原因,深化和细化基本知识的讲授,这对实际应用和提高可起到至关重要的作用。
2.5理论课中的实践内容
单片机是一门实践性极强的课程,该理论课不讲授实验实际是一个误区。在理论课应用Proteus做部分仿真实验,实验效率高、理论教学效果好,并可达到扩展学习到课外的效果。因此,需协调好理论与实验课关系,对仿真实验学时做一定的硬性要求。另一个问题是系统调试技术的教学。系统调试是初学者开发单片机应用系统的一个难点,特别是在无仿真器情况下进行软件调试。因此,在理论课中讲述初等调试技术是有必要的,例如用示波器、LED显示测信号、串行通信监测程序流程等。使学生提高系统设计和调试技能的同时,提高了实验课效率,使实验课有更多的时间用于综合性实验中。
3实践教学模式的改革
3.1基于项目引领的实验模式
我们许多课程的实验课教学模式,基本上都出于传统的公共基础课实践教学。其特点是对单一某个理论教学内容进行实验演示和验证。由于思维的惯性,这种传统自然也延续到单片机实验课中,致使学生综合性实验能力较弱,完成课程设计和实际应用设计的难度较大。作为嵌入式基础和初级应用的单片机基础课程,其最大特点是工程性。单片机本身是一个强大的系统集成工具,学生在专业知识基础上用单片机及相关器件进行综合分析和设计,最终要制作出满足用户要求的产品。因此,单片机实验课的主体思路是综合性、工程性。基于这一点,我们对实验课在宏观上调整为基于项目引领的实验模式。首先是将基础性实验以Proteus软件仿真形式在理论课上实验和演示;其次是配合理论课将整个学期的实验课安排成一个应用项目,将整个项目按照内部资源、扩展资源、前向通道、后向通道和人机通道等部分分解成各个模块作为每次试验课的内容。学生在完成单次试验的基础上,从软硬件的角度对项目整体架构不断地加深认识和理解,最后完成一个项目的全过程实验。在这个过程中,学生不断地积累系统级分析设计的能力,不断地积累着成就感。学生增强了对实验课的兴趣,大幅提高了单片机实验课的效率和效果。
3.2多种实验手段的综合运用
现在高校学生基本上都基于实验箱做实验。相对于传统实验手段(手工焊接或用面包板),实验箱在单片机应用系统的软件实验方面具有优越性,但在硬件实验方面,则现出其明显的弊端。学生按照实验指导书的指示在实验箱上连接各端子,学生大多不去了解这种连接后形成的电路;没有从设计、元器件连接、调试到完成全过程的锻炼;实验箱资源有限;不能进行多种硬件方案的试验、硬件电路的优化设计和创新。我们根据实验不同分别采用不同的实验手段。应用面包板的实验,侧重于自己设计电路实验方案、创新潜能的开发和硬件系统级调试技术的学习;手工焊接的实验侧重于实际动手技能和模块及硬件调试方法的学习和锻炼;应用试验箱的实验则重点侧重于复杂系统的编程和软件调试。同时,这些实验手段的综合应用,给学生创造了一个宽松的软硬件实验环境和发挥创造性的空间,增大了实验课的吸引力,促进了对理论教学的理解,达到了很好的效果。
3.3发掘第二课堂的深度和广度
单片机课外教学活动是可行和必要的。组织成立学生课外活动小组,为学生设计阶段性任务。这些任务可以是承担科研项目的分解部分,也可以是有意义和价值的小题目。学生的任务可以指标化,小组实行优胜劣汰。这对学生提高课程兴趣、加深理解、拓展知识和带动整体学习起到了重要作用。每年一次由教育部和信息产业部共同举办的大学生电子设计竞赛,是一次极好的单片机实践教学活动。要进行规范整理,优化模块设计,使之成为标准件,进而成为教学资源,进而促进教学教改工作进展和良好学风校风的建设。
4结语
实验操作是理论联系实际的重要环节,实验报告必须在科学实验的基础上进行,实验报告的撰写是知识系统化的吸收和升华的过程,实验报告应该体现完整性、规范性、正确性、有效性。现将撰写实验报告的有关内容说明如下:
1.实验名称
2.实验目的
本次实验所涉及并要求掌握的知识点。
3.实验内容与实验步骤
实验内容、原理、原理图分析及具体实验步骤。
4.实验环境
实验所使用的器件、仪器设备名称及规格。
5.设计实验数据表格
6.实验过程与分析
详细记录在实验过程中发生的故障和问题,并进行故障分析,说明故障排除的过程及方法。
根据具体实验,记录、整理相应数据表格、绘制曲线、波形图等,并进行误差分析。
7.实验结果总结
对实验结果进行分析,完成思考题目,总结实验的心得体会,并提出实验的改进意见。
注:1.前5项必须在做实验之前完成,并由指导教师签字后才能做实验。
2.对于学生自拟实验题目、参与科研、创新实验等形式实验项目的实验报告可采用论文、实验总结报告等形式完成。
3.此封皮标准页面为16K,实验报告:实验名称:
熟悉PIC系列单片机的开发环境及简单编程
实验目的:
1. 通过顺序结构的简单程序设计,熟悉PIC系列单片机的开发环境,掌握基本应用步骤和命令;
2. 熟悉汇编语言指令,掌握基本的程序设计方法。
实验环境:
PC计算机 MAPLAB编译环境
实验原理 :
实验一:交换两个寄存器内容(例如交换f10H和f11H的内容) 实验过程比较简单,无分支程序,而且思路十分清晰,难度不大。
实验二:(选作)将某一寄存器内容中的奇偶位数据交换。
本实验的思想是:将寄存器中数据同10101010二进制数相与,得到原数据的奇数位,并向右移一位后存至一个寄存器,作为结果数据的偶位数;再将寄存器中数据同01010101二进制数相与,得到原数据的偶数位,并向左移一位后存至另外一个寄存器,作为结果数据的奇位数。最后,将这两个寄存器中的数字进行或运算,得到结果。
实验中,使用了RO作为记录原数奇位数的寄存器,RE作为记录原数偶位数的寄存器,RN作为记录员数据的寄存器,RR作为记录结果的寄存器。
实验程序:
实验一:
LIST P=16C54
RA EQU 10
RB EQU 11
RT EQU 12
ORG 1FFH
GOTO MAIN
ORG 0
MAIN NOP
MOVLW 0
MOVWF RT
MOVLW 15H
MOVWF RA
MOVLW 3AH
MOVWF RB
MOVF RA,0
MOVWF RT
MOVF RB,0
MOVWF RA
MOVF RT,0
MOVWF RB
END
实验二:(选作)
LIST P=16C54
RO EQU 10
RE EQU 11
RN EQU 13
STATU EQU 3
CARRY EQU 0
RR EQU 12
ORG 1FFH
GOTO MAIN
ORG 0
MAIN NOP
MOVLW 99H
MOVWF RN; GIVE VALUE
ANDLW B'10101010'
MOVWF RE
BCF STATU, CARRY
RRF RE; ODD->EVEN
MOVF RN,0
ANDLW &nbs p; B'01010101'
BCF STATU, CARRY
MOVWF RO
RLF RO; EVEN->ODD
MOVF RO,0
IORWF RE,0; ADD THE TWO PARTS OF THE NUMBER BY OR THEM
MOVWF RR
END
调试结果:
实验一结果:
1、赋值后
2、调换中
3、调换后
实验二结果:
1、赋值后
2、取奇数位的数值存入RE
3、将奇数位的数值右移一位
5、取偶数位的数值存入RO
6、将偶数位的数值左移一位
7、得到最后结果
实验分析与实验体会:
本实验通过顺序结构的简单程序设计,我基本掌握了PIC系列单片机的开发步骤和命令,熟悉了PIC系列单片机的开发环境MAPLAB,并在具体变成过程中,熟悉汇编语言指令,掌握基本的程序设计方法。
虽然本实验是基本练习,目的是为了熟悉实验环境,但是,在实验中还是学到了很多东西:
摘要:本文探讨了基于C语言的ARM嵌入式程序设计课程中学生反映不好掌握的一些知识点。
关键词:ARM嵌入式;C语言;程序设计;技巧
中图分类号:G642
文献标识码:B
引言
嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计语言。如何能够在嵌入式系统开发中熟练、正确地运用C语言开发出高质量的应用程序,是学习嵌入式程序设计的关键。下面介绍基于C语言的ARM嵌入式程序设计课程中学生反映不好掌握的一些难点。
1变量定义
先看下面一个例子:
char a; char a;
short b; char c;
char c; short b;
int
d; int
d;
这里定义的4个变量形式都一样,只是次序不同,却导致了在最终映像中不同的数据布局,如图1所示。显然,第2种方式节约了更多的存储空间(Pad为无意义的填充数据)。
由此可见,在变量声明时,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。
图1变量在数据区里的布局
对于局部变量类型的定义,一般情况下,人们总是设法使用short或char来定义变量,以节省存储空间;但是,当一个函数的局部变量数目有限时,其结果恰恰相反。因为编译器会把局部变量分配给内部寄存器,每个变量占用一个寄存器,如图2所示。假定a1是任意可能的寄存器存储函数的局部变量,同样完成加1的操作,32位的int型变量最快,只用1条加法指令。而8位和16位变量,完成加法操作后,还需要在32位的寄存器中进行括号扩展,其中有符号的变量,要用逻辑左移(LSL)和算术右移(ASR)2条指令才能完成符号扩展;无符号的变量,要使用1条逻辑“与”(AND)指令对符号位进行清0。所以,使用32位int或unsingedint局部变量最有效率。
图2不同类型局部变量的编译结果
变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。通常情况下这是正确的,但也有例外。
例如:冗余变量的使用与否比较。
int f(void);
int g(void);
int errs;
void test1(void)
{
errs+=f();
errs+=g();
}
void test2(void)
{
int localerrs=errs;
localerrs+=f();
localerrs+=g();
errs=localerrs;
}
在第一种情况test1()里,每次访问全局变量errs时,都要先从相应的存储器Load到寄存器里,经f()或g()函数调用后再Store回原来的存储区里面。在这个例子里,一共要进行2次这样的Load/Store操作(第一次是Load,第2次是Store)。而在第2种情况test2()里,局部变量localerrs被分配以寄存器,这样一来,整个函数就只需1次Load/Store访问全局变量存储器。减少存储器访问的次数对于系统性能的改善是非常有好处的。
2参数传递
为了使单独编译的C语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准ATPCS(ARM-Thumb Procedure Call Standard)。ATPCS定义了寄存器组中的{R0~R3}作为参数传递和结果返回寄存器。如果参数数目超过4个,则使用堆栈进行传递。由于内部寄存器的访问速度远远大于存储器,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在4个以下。例如:从C语言中直接调用汇编语言函数:
extern void strcopy(char *d,const char *s);
int main(void){
const char src=“Source”;
char dest[10];
…
strcopy(dest,src);
…
}
AREAStrCopy,CODE,READONLY
EXPORT strcopy
strcopy
LDRBR2,[R1],#1
STRBR2,[R0],#1
CMP R2,#0
BNE strcopy
MOVPC,LR
END
例子中的函数strcopy(dest,src)用汇编来实现。根据ATPCS的定义,函数参数从左到右由寄存器进行传递,所以在汇编中可直接由R0和R1进行引用。这样,在C语言和汇编语言之间进行相互调用就容易实现了。
3循环条件
计数循环是程序中十分常用的流程控制结构。在C语言中,常用下面累加计数的循环形式:
for(loop=1;loop
这种累加计数的方法符合一般的自然思维习惯,所以下面这种递减计数方法很少使用:
for(loop= limit;loop!=0;loop--)
这2种循环形式在逻辑上并没有效率差异,但是映射到具体的体系结构中时,就产生了很大的不同,如图3所示。
图3不同的循环条件设置比较
从图中可以发现,累加法比递减法多用了1条指令,当循环次数比较大时,这2段代码就会在性能上产生明显的差异。
其本质原因是:当进行一个非0常数比较时,必须用专门的CMP指令来执行;而当一个变量与0进行比较时,ARM指令则可直接利用条件执行的特性(NE)来进行判别。因此,在ARM的体系结构下编程,最好采用递减至0的方法来设置循环条件。
参考文献
[1] 梁合庆等. 从C到嵌入式C编程语言[M]. 北京航空航天大学出版社,2000.
[2] 田泽. 嵌入式系统开发与应用[M]. 北京航空航天大学出版社,2005.