时间:2023-06-02 09:59:37
开篇:写作不仅是一种记录,更是一种创造,它让我们能够捕捉那些稍纵即逝的灵感,将它们永久地定格在纸上。下面是小编精心整理的12篇汇编语言程序设计,希望这些内容能成为您创作过程中的良师益友,陪伴您不断探索和进步。
中图分类号: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.前言
汇编语言是我们理解整个计算机系统的最佳起点。人们往往认为汇编语言的应用范围很小,因而忽视了它的重要性。其实汇编语言对学习计算机科学与技术的人是非常重要的。所有程序,不论用何种语言进行编制,只有转成机器指令,运用机器的逻辑功能,功能才得以实现。
汇编语言直接a描述机器指令,比机器指令更容易记忆和理解。通过学习和使用汇编语言,我们才能够感知、体会、理解机器的逻辑功能,这样不仅可以为理解各种软件系统的原理打下技术理论基础,而且可以为掌握硬件系统的原理打下实践应用基础。
2.教学中存在的问题
当前高级语言的发展非常迅速,各种开发工具层出不穷,其功能也越来越强大。高级语言进行程序设计的可操作性越来越强,许多非计算机专业人员在不了解计算机的结构、没掌握计算机相关的专业理论和各种计算机语言具体编程等情况下,同样能很好地使用高级语言。所以,高级语言的发展弱化了汇编语言的地位,这使部分高职学生觉得汇编语言已不重要了,学不好没有多大的关系。所以,思想认识上的不重视,导致了部分学生学不好这门课程。
《汇编语言程序设计》的学习需要一定的英语知识。高职学生的英语基础普遍差,据有关职业教育方面的统计资料显示:在高职高专院校中60%的学生英语基础差;30%的学生有一定的基础,但对英语学习不感兴趣;10%的学生英语基础较好。实际上,普通高职高专院校学生英语的基础情况比统计的更严峻。这就为他们学习这一课程带来了一定的障碍。
针对这一系列的情况,笔者根据教学经验,总结了在高职院校教《汇编语言程序设计》的一些心得,希望对大家有所帮助。
3.注重课堂教学
3.1优化教学内容。
本课程涉及内容较多,教师应在讲课之前先对课本内容进行优化。并不是课本上所罗列的内容都需要讲,教师要有选择性讲解:对学生有用的而课本上讲得不全面的要补充讲解,而对学生用处不大的可以不讲或一带而过,争取做到“少而精”。
3.2让学生充分认识到该课程的重要性,提高学生的学习的兴趣。
“兴趣是最好的老师”,如何让学生对本课程感兴趣?笔者认为关键是把握好开学第一堂课。在学生刚接触本课程时,教师不要急于介绍理论知识,而是要强调该课程的实际应用,通过介绍汇编语言的特点和汇编语言在一些典型系统开发中的具体应用来激发学生的学习兴趣。
目前对单片机的灵活编程已经应用到各个领域,无论是尖端科技,如军事、通信、能源、机器人、交通、IT,还是现代工业、农业,如仪器仪表、汽车电子系统、家用电器、玩具、个人信息终端等诸多领域,都离不开单片机。而单片机的编程里大部分都使用了汇编语言,汇编语言的易用和灵活的特性,使得汇编语言将继续占有独特的地位,其适用的领域要求执行效率高、反应快,如操作系统内核、工业控制、实时系统、家用电器的计算机控制功能等。在讲述其重要性和应用领域时,教师应结合一些身边的、具体的实例,如电梯升降的控制程序和广场的大型喷泉的控制程序均是由汇编语言编写的,学生的兴趣会被这些实例极大地调动起来。
3.3注重实践环节。
在计算机相关专业的教学领域,实验教学是培养学生学习能力、实践能力、思考能力、创新能力的重要环节和有效途径。学生在学习汇编语言这门课程中产生的困难,来自于他们对所学知识缺乏必要的感性认识,没有得到充分的实践。
计算机在很多方面不同于其他学科,尤其是与硬件有密切关系的课程。由于汇编语言课程与硬件操作有着密切关系,因此实验环节在整个教学活动中占据了举足轻重的地位。汇编语言的实验对培养学生的动手能力和学习兴趣,提高学生阅读、编辑和调试程序的能力,有着不可替代的重要作用。学生通过实验能深入了解CPU、存储器、接口及外部设备的工作特性,对数据在计算机中的表达和传送产生感性认识,在实验中学生能对汇编语言有更好的理解、掌握,从感性认识上升到理论认识。
4.改进教学方法
4.1对照教学法。
在讲汇编语言时,教师可以和其它语言对照讲解,比如C语言。C语言作为一门基础和先驱课程,在此时起到了很好的借鉴作用,由于大部分学生对C语言掌握得较好,基于语言的相通性,在汇编语言的相关教学中教师若以C语言作为对照展开讲解,将会收到很好的教学效果,也能增进各科之间的知识和方法上的联系。下面笔者结合教学实践,列举一些应用对照教学法的实例。
MOV指令是8088指令系统中首要讲解的一个指令,也是汇编程序设计中使用最频繁的指令,教师应强调对操作数的要求。有几点我们可以用C语言来对比解释:
传送过程。其传送过程类似于C语言中的赋值,只是在这里是给寄存器或存储单元赋值,其实C语言中的变量名本身就是一个符号地址,汇编程度的赋值最终应对应到存储器的某些存储单元。
两操作数的类型匹配问题。该内容在C语言中已作了强调,汇编中类型匹配问题也是一个重点。与C语言类似,汇编语言操作数的位数要保持一致,只是在8088中常用的类型为字节和字。
强制类型转换。C语言中用到了该知识,学生也已掌握,那么汇编语言中又如何实现呢?很自然地我们就可以引出“BYTE PTR”和“WORD PTR”这两个操作符。
4.2互动式和启发式教学。
高职学生的课堂气氛一般比较活跃,他们非常喜欢教师引导、提问,喜欢回答问题。所以教师应利用这一特点在上课过程中设计一些有意义的提问,利用提问将要讲的知识点引出来,避免平铺直叙地讲解知识点,这样让学生带着问题来学习知识点,会起到事半功倍的作用。例如,在讲解编程部分的循环结构时,笔者先举了这样一个例子:求1+2+3+……+100的和。学生立刻就说出结果为5050。笔者接着问:加到1000呢?这样很多学生饶有兴趣地听讲。可见,教师所选的题目要由浅入深,要能激发学生的学习兴趣,要想办法让学生变被动学习为主动学习。
课堂练习也是互动式教学一个非常重要的方法。在讲解完某一个例题后,教师可以出一道类似的习题让学生在课上完成,请学生上讲台在黑板上写出解题步骤并进行讲解。例如刚学习了用循环的方法求1+2+3+……+100的和,教师可以让学生练习一道2+4+6+……+100的和。这样可以检验学生的掌握情况,找到学生理解错误的地方,从而对症下药。就学生理解错误的知识点再进行讲解,这样除了可以让学生当堂能够掌握所学的知识点,还能让其做到举一反三。
4.3实例教学法。
由于本课程是一门比较抽象的课程,因此教师在课堂讲授中应该尽量用一些通俗易懂的例子进行教学。
例如在讲解汇编中存储器地址分段的概念时,为了便于学生理解,教师可以借助平时生活的居民楼,进行举例。一个小区有多个居民楼,如一号楼、二号楼等,每个楼里有多个室,如101室、102室等。我们可将楼号比作段基值,每个楼里的房间比作偏移地址,很显然一号楼的101和二号楼的101是不一样的。这个例子可以使学生易于理解分段的概念。
再如在讲解中断的概念时有很多例子可举。把教师上课比作CPU正在处理的事,门外有学生打报告,教师就暂停正在处理的事情让学生进来,等学生进来后接着讲课。这样学生很容易就能掌握中断的概念。
教师可以将难理解的知识点与日常生活中的小事相联系,这样既可以使学生学到扎实的理论知识,又不会使学生学得吃力。
5.充分发挥多媒体教学的作用
汇编语言指令多、变化多,相对其他可编程语言来说源程序长而复杂,一个简单的问题解决至少要几十行,多则上百行,教师讲解例题时如果板书,就要花去大部分时间。如何解决这个问题呢?多媒体能够提高教学效果,扩大教学范围,延伸教师的教育功能。教师应在课前准备讲解的程序,上课时直接操作计算机,一边讲解指令的格式及算法,一边将指令使用前后的情况、程序的效果等通过投影仪展示给学生。计算机教学还可借助网上丰富的资源、图文并茂的生动界面、多姿多彩的影像资料,这些可使教学具有感受性、新颖性、可组合性、可扩充性,使学生的思维更加具有发散性,更容易培养学生的创新思维。
6.结语
笔者对汇编语言课程的教学内容和教学方法进行了探讨,这些教学方法促进了课程的建设与发展,为学生学好后续课程打下了一个良好的基础。摸索一条适合高职学生需要的、有效的教学方法,使高职学生能更好地、更快地掌握汇编语言程序设计,培养学生的分析问题、解决问题和实际操作能力,我们在汇编语言课程教学中需要继续探索研究的目标。
参考文献:
关键词:汇编语言;教学改革;多媒体教学方法;案例教学方法
中图分类号:G434 文献标识码:A 文章编号:1672-7800(2012)005-0214-02
0 引言
汇编语言程序设计是计算机专业及相关专业重要的专业必修课。汇编语言面向计算机硬件,与计算机机器指令一一对应,功能强大,使用灵活。目标程序效率高,长期以来一直适用于系统软件及驱动程序的编写。汇编语言程序设计课程不仅需要培养学生的程序设计技能,而且还要培养学生对计算机硬件运行机制的理解能力,为学习后续与硬件密切相关的课程(如计算机组成原理,微机原理与接口,单片机等)打下扎实的基础知识,同时,它也是NCRE三级的一个可选科目,因此其对计算机专业及相关专业的重要性不言而喻。
该门课程的特点是软件知识与硬件知识相互融合,理论与实践并重,同时对英语水平的要求也比一般计算机高级语言高,而独立学院是一种新型高等教育办学形式,其高考招生录取分数线主要介于普通本科和高等专科之间。独立学院学生在基础知识、自身素质、自制力、认知能力等方面与一本和二本的学生存在一定的差异。所以在汇编语言程序设计课程教学中,许多学生都反映课程内容抽象,难理解、难掌握,从而产生了不同程度的畏难心理,对教学效果产生消极影响。为了能较好地提高该课程的教学质量,本文从该门课程和学生特点入手,通过长期的教学实践,总结了一些思路和建议,并将其运用到实际教学中,有效地提高了学生的学习积极性,取得了较好的教学效果。
1 独立学院汇编语言程序设计课程教学中存在的问题
1.1 从课程内容来说,客观上确实比较抽象
学习汇编语言程序设计的学生,通常只学习过计算机导论和一门高级计算机语言,对于计算机硬件运行的机制很陌生,无法将冯•诺依曼工作原理与80x86计算机组织相互联系,导致一开始学习面向硬件编程的汇编语言,就有很强烈的挫折感,丧失了学习的自信和兴趣。由于学生80x86计算机组织的知识没有很好掌握,使得其指令系统和寻址方式的学习根本难以有效进行,其后果是这门课程难以学下去。
1.2 学生未养成良好的学习习惯,没有掌握正确的学习方法
汇编语言程序设计课程一般开设在大一第二学期,许多学生还没有完全适应大学的学习方式,遇到困难容易退缩,不能发挥学习的潜能,且对自己学习时间安排不够科学充分,达不到消化吸收课堂和课本知识的效果。部分学生还有“等靠要”的依赖思想,等教师来总结,靠教师来消化,要教师来灌输,没有发挥学习主体应用的主观能动性。
1.3 教学过程没有以学生为中心
传统教学方式以教师和教材为中心,课堂上教师与学生沟通较少,这样显然教学进度有了保证,但学生是否能跟上教学的进度却成了未知数。不充分的沟通还导致了教师对学生的学习指导缺乏针对性。教师不了解学生学习困难的具体细节,不可能正确引导学生克服困难,也无法加强教师与学生的相互联系。
1.4 学生理论与实践脱节
在汇编语言程序设计教学过程中,理论与实践是并重的关系,偏袒任何一方都不可能有好的教学效果。偏向理论,实践不到位,应用能力低下;偏向实践,学习到的知识无法系统化、条理化,不利于知识水平的提高和升华,导致知识水平有一定的局限性。在该门课程教学实践过程中,这两种情况的学生都有,急需教师给予科学引导。
2 独立学院汇编语言程序设计课程教学改革
为了解决好上述教学问题,笔者针对独立学院的办学特点和学生特点,总结了一些有益的思路和想法,具体思路如下:
2.1 课程开始时,要和学生就如何学习好汇编语言程序设计这门课程作充分的沟通
课程一开始,就需要将这课程的特点、难点,及其所需要的合理学习时间和正确的方法告诉学生,帮助学生科学合理安排好自己的学习时间,使学习达到应有的效果,同时也有利于学生做好积极战胜学习困难的心理准备。通过笔者自身的学习经历和与众多学习效果比较好的同学沟通,一致认为汇编语言程序设计在学习的开始阶段,上课时间与自己理解消化的时间的比例以1∶6为佳。
2.2 使用多媒体教学方法,变抽象为具体
主要是通过制作多媒体课件,使用文字、图形/图像、动画等素材,向学生动态展现学习内容里比较难想象和难理解的部分,帮助学生深刻理解80x86计算机组织和运行机制以及计算机工作原理的动态过程,从而为学生学习指令系统和寻址方式清除障碍,打下坚实的知识基础,并为今后的硬件知识学习建立一个初步的知识框架。同时,帮助学生克服学习上的困难和挫折感,保持学习的自信和兴趣。
2.3 引入“案例”式教学方法,加强理论联系实际,理论指导实际工作
“案例”式教学方法的引入,可以使学生将学习的理论进行实践,学生在学习理论的过程中始终在思考如何完成对应的案例,较好地激发了学生的学习热情和学习兴趣,同时也兼顾了学习的连贯性和整体性。如让学生完成一个“从键盘输入2个十连制数,然后比较它们的大小,最后在屏幕上输出比较结果”的案例,可以让学生完成对输出/入、字符比较等理论知识的实践,又可以使学生提高如何将有关的理论知识联系在一起,解决实际问题的能力。
在每次实践前,都要求学生做好实践计划,将有关理论知识进行复习。实践完毕,都要求学生对结果进行原因分析,成功的,总结经验;失败的,吸取教训。从而提高学生的理论水平,防止理论与实际脱节。
2.4 教学以学生为中心,课堂教学提倡精讲多练
根据学生特点,对教材内容进行漏选,对涉及知识总体框架的重要知识点及其相互关系详讲,而对于偏、难的内容,则略讲或不讲。同时,在课堂教学中实时地,有针对性地进行课堂练习,学生通过练习产生的问题,可以得到及时的反馈,教师也可以及时准确地知道学生的不足,以便针对这些不足进行教学进度计划的调整、加强和补充。这一方式不但提高了学生的学习兴趣,巩固了所学知识,也加强了教师和学生之间的互动和沟通,有利于建立学生对该门课程的学习自信心。
3 结束语
本文总结了独立学院在汇编语言程序设计教学过程中存在的一些问题,并针对性的提出了一些思路和建议,并将其运用于实际的教学实践中。实践表明这些解决问题的教学思路方法具有一定的实际意义,取得了较好的教学效果,有利于培养高素质的应用型人才。
参考文献:
[1] 玉婷.独立学院Visual FoxPro 课程教学与考试改革初探[J].中国教育信息化,2012(2).
[2] 于丽波.三本院校学生特点分析[J].科技信息,2011(8).
关键词: 比较教学法;汇编语言; C语言;实践;教学效果
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2013)10-2402-02
汇编语言程序设计是计算机专业学生的专业基础课、必修课,属于低级语言的程序设计,是硬件类课程和操作系统的先行课和基础课,是高级语言程序设计的扩展。汇编语言是架起软件、硬件知识的一座桥梁,它不但有利于学生理解计算机的工作原理,而且对学生程序设计能力的培养起着十分重要的作用。
在汇编语言课程教学中发现,汇编语言相对于其他高级语言来说缺乏直观性与生动性,是一门比较抽象和理论化的课程,学生养成了“重软件、轻硬件”的学习态度,往往会选择一些容易学习的高级语言而忽视了对汇编语言的学习,因此在教学中普遍存在“教师难教,学生难学”的问题。
如何改善汇编语言课程的教学效果和教学质量,提高学生学习的兴趣和主动性是当前急需解决的问题。将比较教学法引入到“汇编语言”的教学中,该教学方法注重将汇编语言和
高级语言进行比较教学,能够极大提高学生的学习兴趣,取得良好的教学效果。
1 比较教学法在汇编语言课程教学中的应用
1.1 比较教学法
比较教学法( 或叫类比教学法)是指在教学活动中将两个或两个以上的认识对象放在一定的条件下,按照同一标准进行对照比较,从而确定认识对象属性的同异、地位的主次、作用的大小、性能的优劣、问题的难易或认识的正误深浅,以达到辨识、了解和把握认识对象之目的的一种方法[1]。比较教学法是最常用的教学方法之一,也是使用范围最广的教学方法之一。
由于学生在学习汇编语言之前已经至少学习过如C这类高级语言,所以采用比较教学法不仅能更好地理解汇编语言,同时加深对高级语言的理解也有很大的好处。在实际教学过程中,可以将新的陌生的东西(汇编语言)和旧的熟悉的东西(C语言)做比较,找出它们之间相同的地方和不同的地方,然后进行差异化的学习,重在存同求异,这样就会事半功倍,达到理想的教学效果。
1.2 比较教学法在汇编语言课程与C语言课程教学中的实践
高级语言(如C语言)和汇编语言两者都是程序设计的工具,在程序的基本功能和程序设计的基本问题上均有相应的实现机制,同时在某些方面是相通的,换句话说许多用汇编语言能作的工作也可以用C语言来完成。
2)两操作数的类型匹配问题。
2 结论
限于篇幅,以上仅举2个例子来说明教学过程中如何将汇编语言和C语言进行比较教学,已经取得了很好的教学效果。由于语言的相通性,实际上在整个汇编语言教学中还有很多知识点可以把C语言知识贯穿其中。通过比较教学,一方面学生可以更好地学习汇编语言的相关知识,极大地提高学习效率;另一方面,更提高了学生对C语言的更高层次上的认识,间接地对其他学科的学习也起到了很大的帮助作用。
参考文献:
[1] 李运模.比较教学法论略[J].中南民族学院学报:人文社会科学版,2000(3).
[2] 沈美明,沈冬婵. IBM-PC 汇编语言程序设计[M].2版.北京:清华大学出版社,2001.
[3] 谭浩强.C程序设计[M].3 版.北京:清华大学出版社,2005.
“汇编语言”课程是计算机科学、自动化及电子信息类专业的一门核心专业课程。[1-2]对于计算机及其相关专业的学生来说,汇编语言程序设计是需要掌握的重要专业基础知识之一。了解和熟悉汇编语言可以优化学生的知识结构,提高学生的认知水平,增加学生的程序开发手段。相较于快速发展的可视化高级语言,作为低级语言的汇编语言,可读性较差,比较繁琐,不符合自然语言表述,学生普遍感到难学。因此,“汇编语言”课程如何优化教学质量、提高教学效果,是任课教师面临的一个重要问题。[3]本文结合实际教学体会,就如何提高“汇编语言”课程教学效果进行了分析与探讨。
一、汇编语言程序的特点
计算机是一个编码的世界,只能识别和处理由“0”和“1”组成的二进制代码的机器语言,这种指令代码编写易出错且不易修改。于是,人们发明了“指令的助记符”,用助记符(mnemonic)代替操作码,用标号(label)和地址符号(symbol)代替地址码,用这种符号系统形成汇编语言。[4]因此,汇编语言本质上就是机器语言,只不过更容易被人读懂且更容易记忆。使用汇编语言编程,可以对计算机内部硬件进行直接控制,合理地安排机器内部的各种资源。归纳起来,汇编语言程序有以下几个主要特点:
一是与硬件的相关性。汇编语言与机器指令一一对应,不同类型的cpu内部硬件结构不同,因而有不同的指令系统,相应的汇编语言程序也就不同,其通用性、可移植性比较差。二是执行效率高。由于汇编语言与硬件相关,它可以有效、直接地控制机器,程序的执行代码短、速度快,是其他高级语言难以企及的。三是编程、调试相对困难。为了有效地控制机器,汇编语言指令涉及到硬件资源的各种细节,如标志、堆栈、寄存器、存储单元等。相对高级语言,其编程及调试比较繁琐、复杂。[5-6]
二、明确教学目的,优化教学内容
1.激发学生的学习热情
“汇编语言”与许多课程联系紧密,如图1所示,它是“操作系统”、“计算机接口技术”、“计算机组成原理”、“嵌入式系统”等课程的基础,在开发嵌入式系统时更是必不可少的语言。“汇编语言”课程学习起来比较枯燥、学习周期较长,不像高级语言那样上手比较容易且能很快见到效果。因此,应教育学生少一些急功近利的思想,应着眼于长远的、全面的技术成长。有条件的教师可以将自己相关的科研成果带入课堂,说明汇编语言有着广泛的应用领域。在授课过程中,注意拓宽学生的知识面,结合具体的应用,激发学生的学习热情。
2.优化教学内容
不同于高级语言的教学模式,汇编语言是一种硬件编程语言,是连接软硬件的桥梁。一方面,汇编语言与芯片密切相关,学习汇编语言时应具备一定的硬件基础知识,需要时穿插相关知识点,回顾前导课程的相关内容,如计算机结构等;另一方面,又不需要紧跟着产品来讲授,只要选择一种典型的汇编语言指令集讲清楚、讲透彻,使学生掌握学习与思考的方法,今后遇到其他的芯片,也就可以举一反三,触类旁通。
具体到一种汇编语言指令集,应突出其重点、难点,如分段管理技术、寻址方式、堆栈管理、中断技术等。为了便于后续程序结构的学习,在学习寻址方式和指令集时就教会学生使用debug,讲解了常用的调试命令,使学生能尽快上机实践,验证指令,编写短小程序,看到运行结果,从而加深影响,巩固所学的内容。由于汇编语言的指令很多,涉及的知识点抽象,刚开始接触这门课程时,学生往往不太适应,前后的知识点容易混淆,教师应及时对讲授过的内容进行比较与小结。课堂上,应适当增加讲授例题的数量,不同的教学阶段,例题的侧重点不一样。开始阶段,例题主要涉及汇编语言格式与汇编语言指令;中间阶段,例题讲授的是如何用汇编语言指令实现汇编语言流程;后续阶段,例题重点讲解汇编语言程序设计算法的确定,分析、解决问题的思路与方法。而在学生掌握了基本内容及重点内容的基础后,教师应提纲挈领,从系统的整体角度分析“汇编语言”课程在整个硬件知识体系中的作用,让学生从更高层次理解、使用汇编语言。
3.多种教育手段相结合
随着现代教育技术快速发展,多媒体技术在教学中有着广泛的应用。在“汇编语言”课程中,可以利用多媒体课件图文并茂的特点吸引学生的注意力,活跃课堂气氛。例如,可以通过动画形式将寻址过程、堆栈变化、循环移位、子程序调用、中断调用过程等表示出来,将复杂的、抽象的问题简单化、形象化,提高教学效率。而在确定汇编语言程序设计的算法,用汇编语言实现编程,培养学生的推理、思维能力时,采用传统教学方法。对不同的知识点,结合不同的教学方法,有利于学生对不同教学内容的理解与掌握。
三、注重实验环节,提高教学效果
1.实验平台及实验内容
汇编语言程序设计要经过编辑、汇编、连接和调试等过程,如图2所示,传统的上机实验一般是在dos操作系统环境下进行的。目前流行的是windows操作系统平台,学生对dos操作环境相对陌生。为了提高上机的效率,应摒弃dos环境,采用基于windows操作系统的汇编语言集成实验环境。在该环境下,可以方便编辑汇编语言程序,使用下拉式菜单或快捷按钮进行汇编、连接及调试等工作,并可以预先设定段定义、过程定义等。
在实验内容安排上,应根据授课的进度及学生的掌握程度,并与教学目标相匹配,精心选择一些有代表性的、有实用价值的内容,尽量避免实验内容过长、过杂等问题。实验的内容应包括:指令系统及调试工具debug使用;汇编语言程序设计上机环境及过程;顺序、分支、循环基本结构程序设计;子程序设计和宏汇编程序设计;中断调用程序设计;综合性实验。
转贴于
2.发挥学生在实验中的主体作用
在整个实验过程中,以学生为主体,教师只是起到组织、引导的作用。
实验前,教师讲解难点、重点及有关注意事项,点到为止,也可以先给出相关的问题,让学生去思考、去观察。要求学生对实验内容进行预习,并在下次上实验课时用提问、抽查等形式检查。学生通过预习带着问题进行实验,可以提高学习的主动性,且能对知识点的领悟更深刻。
实验中,鼓励学生按照自己的思路去编写、调试程序。对于学生在实验过程中提出的问题,一般不直接给出答案,而是引导学生通过学过的理论知识自己寻找解决的方法。只要能达到预定的实验目标,对实验步骤及过程不做过多要求。对学有余力的学生,鼓励他们在完成规定的实验内容后,对补充题或对自己设计的问题进行实验;而对基础较差的学生,则鼓励他们独立地解决问题。
实验后,要求学生及时对实验进行归纳、总结,并撰写实验报告。
3.实验实践贯穿整个教学
“汇编语言”课程有其特殊性,只有通过不断的上机实践,学生才能加深对理论知识的理解,提高编写程序的能力。因此,要转变观念,重视实验教学,避免实验教学流于形式。程序设计是一个调试修改语法及逻辑错误,最终得到正确程序的过程。教师应充分利用多媒体等手段,引导学生动手编程,通过实际例题观察数据流变化,培养学生调试、修改程序的能力和意识。教师演示与学生实践可以穿插交替进行。如果学生对自己编的程序没有把握,则鼓励他们上机进行验证,反复地调试、修改、运行。对有些验证性实验,可以用作业的形式要求学生在课外完成。如用debug调试工具验证各类指令的功能和格式,对标志位的影响,查看数及字符在存储器中的存放形式,堆栈的变化等。既加深了学生对所学内容的理解,又为汇编语言程序设计打下了基础。
本课程的目的是使学生掌握程序设计的方法,学会用汇编语言编写程序。结合各章节所学的知识点,每次实验要求学生编写相关的程序,检验学生具体知识点的掌握程度。注意加强前后实验之间的相互联系,融会贯通各个知识点。随着课程进展的加快,实验内容应从比较简单到相对复杂,再到课程结束阶段,经过知识及多个实验经验的积累,使学生具备一定的程序设计能力。
关 键 词:C语言;计算机;软件编程;实验研究
一、C语言的概述
在1967年BCPL语言被英国MartinRichards 推出,到1970 年B 语言以BCPL 语言为基础被美国Ken Thompson推出[1]。但是B 语言过于简单,而且功能有限,经过研究者的多次试验研究,在1972—1973 年,C 语言在B 语言的基础上经过完善,被美国贝尔实验室D.M推出[2]。在各种计算机编程语言中,C语言属于一门高级语言,它是一切计算机语言的基础,拥有高级语言和低级语言的特点,灵活方便,简洁紧凑;而且它的语法限制不严格,程序员在设计时程序书写自由。不仅能够编写系统软件,同时还可以编写应用软件,能够适应于多种操作系统,应用广泛,可移植性强。总之,C语言对于信息技术的发展具有十分重要的作用和价值。
二、基于C语言的计算机软件编程实验研究
(一) C语言的编程技巧
1.灵活运用指针
在C语言编程的时候,指针是一种特殊类型的变量,它能够帮助程序员有效的表达和解决程序设计过程中遇到的复杂问题,熟练掌握指针是必要的。指针具有三要素:指针名以及指针类型和值[3]。在编程时,指针和一般变量名相同,但是在类型以及值上具有区别,另外,指针不仅能够被用于表示数组,还可以被作为函数的参数返回值。
2.C 语言的特有函数
在C语言编程的时候,有时需要用到一些特有函数。函数都具有一定的功能,同时函数名也反映了该函数的功能。在进行函数定义时,程序员需要把函数的名字、返回值类型以及参数名等各项都进行定义。另外,因为库函数是由C 编译系统提供的,这些函数均是系统首先定义好的,在程序调用的时候,程序员只需利用“#include 指令”把与之相关的头文件包含到所用文件中即可[4]。例如,在程序运行的过程中,如果用到了sqrt函数,则为了保证程序运行下去,头文件必须含有#include“string .h”。
3.算法技巧
在程序设计的过程中,算法是程序的灵魂,因此,掌握一定的算法技巧是必不可少的。通常情况下,算法不仅可以用自然语言表示,有的时候也利用流程图表示。需要注意的是,利用流程图表示算法时,程序设计员必须熟练掌握常用的流程图符号[5]。且“数学乃是计算机之母”,牢固的数学知识同样能够提升编程效率。
4.位运算以及文件知识
相比其他计算机高级语言的运算方法,位运算作为C 语言的重要特色,具有独特性和唯一性。位运算是以二进制位为对象,然后结合相关程序要求进行各种运算。文件包含有数据文件以及程序文件,是计算机不可缺少的,程序设计员在进行编程时,需要把所写的程序存储的文件之中,这样可以便于程序员查找数据,提升查找效率。
(二) C语言和汇编语言混合的程序设计案例分析
在本次的实验之中,在进行程序嵌入时,有其固定的格式,需要在嵌入的各行代码之前加“asm”关键字,也可以直接在asm代码块中放入汇编语句。但是程序设计者在进行嵌入时,一定要注意满足以下条件:汇编语言指令代码中关键字asm必不可少,且要放在指令代码之前;嵌入汇编语言指令代码能够和正常C语言程序混合,但是C语言的分隔符“;”必不可少;嵌入汇编语言时C语言的注释分界符必不可少,分别是“/*”和“*/” [6]。
(2)首先编写C语言程序以及汇编程序,然后独立编译目标代码模块,最终进行链接。
首先,在进行混合编程时,C语言程序能够调用汇编语言的各种子程序以及其定义的变量,同时,C语言编写的函数以及定义的变量等也可以被汇编语言调用。而且混合编程的过程中,一个任务往往是由若干个功能模块组成,且不同的功能模块均是利用合适的语言进行独立编程,且以函数的形式存在。因此,程序设计者要根据每一模块的特点选择相应的语言和语言编程系统进行独立编程,并形成目标文件,继而连接目标文件,形成完整的可执行文件。
在混合编程的过程中,设计者需要注意五个问题:参数传递问题;寄存器的使用问题;存储模式;变量以及函数的调用问题;子程序的返回值问题。
其中,关于参数传递问题,在进行C语言程序调用汇编程序时,必须遵从参数传递原则,利用堆栈把参数传递给汇编程序。例如,在C语言程序中含有函数:voidaa(char*p,int i),这个函数是利用汇编语言进行编写的,如果编译是在小内存模式下实施的,系统在进行调用时,则写成aa(&q , n);运行时程序首先把n压入堆栈,然后再把&q压入堆栈,当参数传递过来并被汇编语言的子程序取得时,BP寄存器便被用作基地址寄存器,实现对栈中所存数据进行存取操作。通常情况下,由于调用的子程序和C语言程序往往使用同一个堆栈,所以在程序执行时,汇编语言子程序需要执行两条指令:push bp pop bp、sp[7]。
2.混合的软件编程实例分析
三、小结
综上所述,随着信息技术的不断发展,人们对于计算机软件编程的功能要求也将越来越高,而利用C语言能够实现计算机软件的多种功能,因此研究者应当强化对于C语言的计算机软件编程实验研究,开发功能更加强大的软件。
参考文献
[1] 侯宏霞.提高“汇编语言”课程实验教学质量的几点思考[J].内蒙古农业大学学报(社会科学版),2011(01):25-26.
[2] 刘海峰.以培养实践能力为导向的“C语言”教学方法探讨[J].科技经济市场,2008(12):33-34.
[3] 阿娜古丽·阿布拉.C语言与汇编语言相互调用实现混合编程[J].电脑编程技巧与维护,2009(10):71-74.
[4] 刘丹,刘德山.C语言程序设计课程综合性和设计性实验研究[J].计算机教育,2012(09):31-32.
[5] 王应军,曲培新,赵晨萍.ARM汇编语言与C语言混合编程的实现方法[J].科技信息,2010(03):69-71.
[6] 方艳红,赵海龙.计算机高级语言程序设计类课程实践教学改革研究[J].中国科技信息,2008(19):12-14.
关键词:计算机组成原理;汇编语言;教学改革
中图分类号:G642.3 文献标识码:A 文章编号:1002-4107(2016)07-0014-02
一、“计算机组成原理”课程的特点
“计算机组成原理”是研究生入学考试的必考科目。该课程以冯・诺依曼型计算机为基础,围绕计算机的运算器、控制器、存储器和输入输出设备等五大部件详细介绍它们的工作原理与算法以及具体实现的电路结构。通过学习本课程,要求学生熟练掌握单总线结构CPU的工作原理和设计实现的方法,同时要求学生初步掌握精简指令系统、流水线结构、多体并行存储器、中断的工作原理等知识,为后续课程“微机原理与接口技术”、“计算机系统结构”做好准备。该课程首先讲授了8086CPU的编程结构,然后引申出8086汇编语言的寻址方式和指令系统,学生在掌握上述知识的基础上,进行汇编语言程序设计。汇编语言程序设计可以让学生加深对程序设计方法的理解,同时程序的编写和调试使学生对计算机硬件有一个感性的认识, 为以后他们学习“微机原理与接口技术”、“操作系统”等课程做准备。
根据国家教育部高教教执委的新的教学改革精神,结合我院的具体情况,我院将“计算机组成原理”与“汇编语言”两门课程合并成一门全新的“计算机组成原理”课程。在新的教学体系中,我们将两门课程有效地结合起来去糟取精删繁就简,舍去了两门课程中的重叠部分而突出重点,形成了一套新的教学体系。
二、“计算机组成原理”与“汇编语言”教学内
容的融合
在传统的“计算机组成原理”课程中,教师始终围绕着计算机的五大部件按照运算器、存储器、控制器、输入输出系统这个顺序进行讲解,在讲授过程中经常会用到一些实例进行说明,而很多时候是以汇编语言做例子讲解的,两门课程融合在一起的最大好处就是教师在讲授“汇编语言”的部分时,可以更好地兼顾“计算机组成原理”,让这两门课程做到无缝对接。
在基础知识部分,我们首先要介绍冯・诺依曼型计算机的特点。冯・诺依曼型计算机是串行计算机的始祖,所有的串行计算机都要符合冯・诺依曼型计算机的特点,这是“计算机组成原理”基础知识部分的重点。在课程讲授过程中,教师都会画一幅五大部件的关系图,通过图形示意来表示一条指令是如何在五大部件之间流动的,从而使用户从外部观察到计算机处于运行状态。我们考虑从这里引入8086CPU的编程结构,从计算机组成原理过渡到汇编语言,让指令举例更加具体化,再结合指令的寻址方式,借机说明8086的汇编语言指令是如何在CPU中执行的。
在接下来的讲授过程中,我们将介绍8086汇编语言的寻址方式和指令系统。由于在计算机组成原理课程中也有一章介绍指令系统,我们可以把这个部分与汇编语言的内容合并,以计算机组成原理的部分强调基本概念,以汇编语言的内容来强调具体应用,把内容更加具体化,举例更具有针对性,可以使学生更好地理解寻址方式和指令系统。在这里我们在教学上做了一点改变,我们考虑到汇编语言指令数目较多的特点将指令分类,每类指令选出一到两个具有代表性的指令进行详细说明,其他略讲,然后采用写出指令执行结果的方式进行大量练习,从而巩固这部分知识。
在讲授了汇编语言的程序设计方法之后,再讲授计算机组成原理部分的运算器与运算方法部分。在这部分我们可以利用学过的汇编语言知识,结合布斯算法和加减交替法编写定点数乘除法的汇编语言程序,还可以编写浮点数运算的模拟程序。在讲授控制器的部分时,我们可以设计一个类8086的CPU,把它作为课堂上的CPU设计举例,这样把一条8086汇编语言指令放在这个CPU中运行,可以更直观地反映指令的工作细节,促进学生对控制器的工作原理和汇编语言的理解。
三、“计算机组成原理”与“汇编语言”实验内
容的融合
“计算机组成原理”与“汇编语言”都有实验课,由于在讲授上先讲“汇编语言”的内容,因此相关实验先进行,然后进行“计算机组成原理”的实验。我院的“计算机组成原理”实验课程使用的是由清华大学计算机学院研制开发的TH-union+教学实验系统,该系统主要用于“计算机组成原理”课程的硬件教学实验,还支持监控程序、汇编语言程序设计。在硬件上同时实现了硬布线方式和微程序方式两种控制器结构,既支持用中小集成度的芯片实现CPU的方案,又支持用高集成度的FPGA门阵列实现CPU的方案。在软件上可实现指令级模拟,也可以软件模拟硬布线和微程序的操作,为学生学习硬件理论知识起到了重要的辅助作用。但是该实验系统的汇编语言指令与8086汇编语言是不兼容的,这使学生在短期内很难快速掌握实验系统的汇编语言指令,因此经课程组全体教师研究决定,另外开发一款新的汇编语言转换软件,用来实现两种不同种类的汇编语言互相转换。
该软件是利用linux模拟环境Cygwin开发实现的。Cygwin是cygnus solutions公司开发的一个在windows平台上运行的类UNIX模拟环境。在这里我们主要使用了Cygwin开发环境里的flex和gcc两个工具软件。利用flex工具软件编写的源代码必须转换成c语言代码格式,然后由linux下的c语言编译器gcc编译成可执行文件,完成最后的开发。
由于TH-union+教学实验系统的汇编语言指令共48条,采用精简指令系统,每条指令的寻址方式是固定的,因此不单独设置关于寻址方式的标志位,当指令进行译码操作的时候,实验系统电路通过分析指令的操作码既了解了指令的操作功能也了解了指令操作数的寻址方式。而8086汇编语言指令是一个复杂的指令系统,每条指令对应着多种不同的寻址方式,因此我们把教学实验系统的汇编语言看成是8086汇编指令系统的子集。通过对转换程序my的使用,帮助学生对比两种汇编语言之间的相同点和不同点,通过对比学习,学生可以更快速地熟悉实验系统汇编语言。
在这里对于不可转换的汇编语言指令可采取两种处理方式:方式一,发出警告提示并忽略此条指令;方式二,发出错误提示并强行结束程序转换。转换程序your分析了操作码之后开始分析操作数的寻址方式。在这里,我们假设所有指令都采用双操作数,因此在结构体中设置了两个对应寻址方式的变量。具体操作时,如果分析出该操作数的寻址方式可以被实验平台支持,那么就将对应数值保存在结构体的对应变量中以便转换,如果不是实验平台支持的寻址方式,系统将提示用户:“你的程序中使用了不可转换的寻址方式”,并强行结束转换。在寻址方式转换过程中,有一些特殊情况需要系统自动追加指令。
最后,要对输入输出指令单独处理。输入输出操作是后续课程“微机原理与接口技术”的重要知识点。在编写汇编语言程序过程中,当遇到输入和输出操作都是直接调用DOS中断或BIOS中断来实现的。但是教学实验系统没有任何中断程序辅助操作,遇到输入和输出操作只能由学生自己编写。在编写8086汇编语言程序过程中,凡是遇到输入和输出操作都通过调用这两个宏来实现。每次进行输入输出操作时必须先对指定的状态寄存器的标志位进行判断,以确定硬件是否准备好,是否可以进行输入输出操作。具体做法是使标号由英文字母和数字构成,每次产生新的标号,后面的数字部分就加1,保证新标号与旧标号不同。
“计算机组成原理”和“汇编语言”是计算机科学与技术、软件工程专业的专业课程,这两门课程存在着很多联系同时也有一些区别,把这两门课程合并成一门全新的“计算机组成原理”课是我院一项新的教学改革方案。如何把两门课程很好地融合在一起就成了课程组面临的一个新的挑战,本文结合课程组全体教师的多年教学经验,抛砖引玉,初步提出了一些在教学和实验上的改革方案,希望各界同人多提宝贵意见。
参考文献:
[1]唐朔飞.计算机组成原理:第二版[M].北京:高等教育
出版社,2008.
[2]王诚,刘卫东,宋佳兴.计算机组成与设计:第三版
[M].北京:清华大学出版社,2008.
[3]沈美明,温冬婵.IBM PC汇编语言程序设计:第二版
[M].北京:清华大学出版社,2001.
关键词:汇编语言 I/O 子程序 库
中图分类号:TP313 文献标识码:B 文章编号:1002-2422(2008)03-0086-02
设计的I/O子程序库包括16位版本和32位版本,可分别应用于16位和32位汇编语言应用程序,提供的子程序功能包括不同数制和字符串的输入与显示,状态标志的显示,满足汇编语言程序设计的通常要求。
1 设计方案
1.1子程序功能需求
根据在汇编语言程序设计中的通常要求,子程序所提供的功能主要包括键盘输入和显示器显示,输入和显示的内容可以是不同的数制与字符串格式。如表1所示。
1.2子程序库结构
为了方便整个子程序库的设计,设计了一些通用予程序。在实现提供给用户使用的子程序时,充分利用这些通用子程序,简化了子程序的代码编写,减少了子程序库的长度。主要子程序之间的关系如图1所示。
字符输入和显示子程序READC、DISPC是整个子程序库输入输出的基础。利用这两个子程序实现了字符串输入和显示子程序READMSG和DISPMSG。子程序READMSG和DISPMSG又是不同数制数据输入和显示的基础:通过调用READMSG读入字符串,然后调用字符串转换子程序STRTOBIN、STRTOHEX、STRTOUI和STRTOSl分别将字符串转换为不同数制的数据,从而实现了不同数制输入的子程序READBIN、READHEX、READUI、READSI等;通过调用DISPMSG显示字符串,然后调用数据转换字符串子程序BINTOSTR、HEXTOSTR、UITOSTR和SITOSTR分别将字符串转换为不同数制的数据,从而实现了显示不同数制的子程序DISPBIN、DISPHEX、DISPUI、DISPSI等。
设计的16位和32位的子程序库提供的子程序功能都是相同的,区别在于16位的字符输入子程序是利用DOS系统调用实现的,而32位的字符输入子程序是利用WIN-DOWS API函数实现的。其他子程序则可以通用。
各个子程序汇编后,由库管理工具LIB.EXE生成16位子程序库I/O16.LIB和32位子程序库I/O32.LIB。
1.3参数传递
汇编语言子程序的参数传递可以采用寄存器传递,共享内存变量和堆栈传递三种方法。堆栈传递参数时,可以用MASM提供的伪指令PROTO来声明子程序,用INVOKE来调用子程序。这两个伪指令在声明和调用子程序时相对于CALL指令和PROC伪指令要简洁得多。使用堆栈传递参数也是高级语言通常使用的子程序传递参数的方法,用堆栈传递参数的子程序可以被高级语言调用。子程序的返回参数也遵循高级语言子程序的规范,采用寄存器EAX返回子程序的出口参数。
1.4宏命令
调用子程序需要用专门的调用指令并遵循一定的格式要求,这对于初学者来说有一定的难度。当子程序的参数比较多时,调用子程序的编码量较多,设计了调用子程序的宏指令,利用宏指令来实现对应的子程序调用,格式简单,使用方便,尤其适合初学者应用。为提高代码的复用性,被调用子程序的声明和宏定义都放在包含文件IO.INC中,在汇编语言应用程序中用INCLUDE语句包含该文件即可。
关键词微机原理 汇编语言 整合 教学方法
中图分类号:G642文献标识码:A
随着计算机技术和通信技术的发展,微型计算机的应用越来越广泛,“微机原理与接口技术”课程也成为除计算机专业外,机械、电子、通信、自动化等相关专业必设的专业基础课。“微机原理与接口技术”课程在一些高校已经逐步和“汇编语言程序设计”课程整合到了一起。这是由于微机原理中要使用汇编语言的知识,汇编编程中又牵涉到微机原理的一些概念。两者相辅相成,且这两门课程都有一定的教学难度,要将它们整合到一起,实现相互印证,相互促进,更是一件难事。通过近几年的教学实践,笔者总结了一些经验,介绍如下。
1 教学过程中注意体现汇编语言本身的优缺点,引导学生学习的方向
学生在学习本课程之前,一般都有过计算机高级语言的学习基础。与高级语言相比,汇编语言存在一些固有的缺点,如对硬件的依赖性较强,可移植性较差,解决问题的步骤较为繁琐,有很多细节问题需要考虑等。①这就好比用户首先学习了如何在饭店点菜,已经习惯了一套简易的流程,现在要学习自己做菜,要考虑的细节更多,也就觉得更麻烦。但学会自己做菜,有利于我们了解菜系的搭配原理,火候问题等,从而制作出更可口的菜肴,如同汇编语言的学习有利于用户了解计算机的工作原理,从而更好地理解微机原理的相关问题。同时,汇编语言的一些细节,也能帮助用户简化一些操作。例如对于求解1+2+3+……+100②这个问题,可以利用LOOP语句中CX每次自减1的特点实现,程序③如下:
MOVAX, 0;用来放累加和
MOVCX, 100;循环次数为100
NEXT:ADDAX, CX ;AX+CX的和传送给AX
LOOPNEXT ;CX减1,判断CX不等于0时,循环,从NEXT标号处执行
这比用高级语言实现更简洁。汇编语言的优势更多的体现在对硬件芯片的编程,例如对8253、8255芯片的初始化编程,程序段比较简洁、直观。教学过程中,要注意引导学生的学习方向,避免学生在学习过程中产生厌学情绪,要让学生看到汇编语言的优点。
2 找到知识的结合点,加强知识的联系
汇编语言是微机原理课程的一门工具性语言,两门课程中有很多交叉结合的知识点。如果在微机原理部分没有理解CPU的内部结构和工作原理,大量的指令就无法正确运用,也就更难灵活运用汇编语言进行编程。④例如汇编语言中大量采用寄存器结构,很多指令中都有指定的寄存器用法,而寄存器是CPU内部结构的重要组成部分,是微机原理的一个重要的知识点,各种寄存器的用法又可以通过寻址方式体现出来。比如基址指针寄存器BP在寻址做基址中使用时,默认数据在堆栈段中,在汇编语言讲解子程序的参数传递一例时,主程序用PUSH语句将参数放入堆栈,子程序中引用参数时,并不采用数据出栈,而是以BP为基址采用寄存器间接寻址方式访问堆栈。再如,微机原理中讲解外设与计算机的数据传送时,可注重介绍IN,OUT输入输出指令在执行时,对接口电路的影响,即汇编语言指令具体执行对硬件的影响,如M/,,信号以及地址译码的变化。⑤
3 重视实验教学,体现指令与硬件的结合,鼓励进行设计型实验
微机原理很多知识需要通过实验来加以验证和运用,上好实验课是教学的重要环节。但该课程的实验课大部分都是验证性实验,都在演示课本上的例子,这对于学生充分理解微机原理,熟练掌握汇编程序设计和锻炼实践能力来说是一种限制。我校实验采用DJ系列8086/8088微机系统,其中实验十五:简单I/O口控制,实现的功能是利用开关K1~K8控制LED灯L1~L8,一个开关控制一个灯的亮灭,⑥所用接口芯片为74LS244,74LS273。该实验为验证性试验,即学生可按实验指导书完成硬件连线,运行现有程序,即可实现功能。如此则学生较难留下深刻印象,也不能很好地理解硬件和软件的配套关系,因此我要求学生在完成实验的基础上,对实验进行修改,例如当地址线重新连接后,端口地址如何变化;如何修改程序,实现一个开关控制8个灯的亮灭。学生通过自己思考,动手实践,实现功能,从而留下深刻印象,加深了对知识的理解,教学效果也圆满实现。对于实验教学,我们应在做好验证性实验的基础上,多挖掘实验仪器的潜力,多让学生思考,多做一些有设计环节的实验,从而提高学生的实践能力。
4 合理安排课时,考核时注意知识点的倾向性
适当调整教学内容讲授的次序和学时分布,讲授内容有所侧重,建立一个合理的教学体系。由于汇编语言在微机原理这门课程中主要是起到一门工具性语言的作用,即很多微机原理的知识需要通过汇编编程加以体现,因此在汇编语言的教学过程中,不要过于强调如何解决那些计算机高级语言擅长解决的软件问题,这本来就不是汇编擅长的领域。汇编的教学中只要求学生熟悉汇编语言指令的基本功能及使用要求,熟悉汇编语言解决问题的思路即可,不要花费过多的时间,应将教学的侧重点放在汇编语言与微机原理的结合处,主要是对芯片控制的编程。在考核的内容上,也应侧重于汇编语言在解决硬件相关问题的作用,从而引导学生的学习方向。
通过对汇编语言和微机原理整合课程的教学改革,使学生对该课程产生了更浓厚的学习兴趣,取得了较显著的教学成果,同时也还存在一些不完善的地方,需要在以后的教学实践中不断改善。
注释
①许颖梅.对汇编语言和微机原理课程整合的探讨[J].福建电脑,2007.1.
②杨季文.80X86汇编语言程序设计教程[M].北京:清华大学出版社,2004.
③赵树升,赵雪梅.现代微机原理及接口技术[M].北京:清华大学出版社,2008.
④马浩.浅谈微机原理与汇编语言教学改革[J].科技创新导报,2009.17.
汇编语言与C语言均属于编程语言,但是二者之间存在着根本上的不同。在开发软件的过程当中使用这两种语言混合程序设计的技术是一种有效的程序设计方法,不仅能够有效提升工作的效率,还可以提升程序的性能。本文主要介绍了汇编语言与C语言混合程序设计的方法,希望给二者之间更好的衔接提供一定技术方面的支持。
【关键词】汇编语言 C语言 设计技术 混合程序
汇编语言是一种面向机器的编程语言,运算速度快,在使用汇编语言的过程可以通过提高存储器运行速度来提升其存储空间,另外,汇编语言其控制作用力应用在硬件上也有着无法取代的优点。同时汇编语言也有着程度较高却复杂和移植性差等缺点,但是在实际的操作中,硬件还有精确定的过程中必须要用到汇编语言。C语言作为一种高级语言,其表达性以及灵活性还有开发性均较高的优势,因此为了更好的发挥汇编语言和C语言在开发软件中各自的优点,将两者有机的结合起来,取长补短混合编程更好的达到设计的要求,高质量的完成设计任务。
1 C语言程序设计技术方法
(1)可以在C语言程序之中确定汇编程序的常、变量。
(2)可以在C语言编程当中适当的增加语句编辑,保证实现C语言无法控制硬件的缺陷。
(3)然而使用C语言程序时可以通过内部函数的使用加入汇编语言中的相应语句。
2 汇编程序设计技术及方法
在C语言编程当中,可以将汇编语言的代码直接的编写进去,并且融入汇编语言的过程当中可以不使用分号,详细的语法是:
asm
若想要将一组汇编语句融入到C语言中,必须要将语句括到括号{}当中。
asm {
mov ax,dataA
xchg ax,dataB
mov dataA,ax
}
一般想要在C语言程序当中编入汇编语言,有四种类型,分别是一般指令、跳转指令、串联指令和局部定义指令。
汇编语言子程序应用在C语言中,一般情况下汇编语言的子程序其基本格式是:
MYCODE SEGMENT PARA PUBLIC‘CODE
PUBLIC_函数名;
公共符号说明DGROUP GROUP MYDATA,MYBBS
MYDATA SEGMENT WORD PUBLIC‘CODE’
...定义变量,初始化数据
MYDATA ENDS
MYBBS SEGMENT WORD PUBLIC‘CODE’
...非初始化数据,开辟内存区
MY BBS END
ASSUME
CS:MYCODE,DS:DGROUP,SS:DGROUP
...
_函数名 PROC NEAR/FAR
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
...程序主体语句
POP DI
POP SI
POP BP
RET
_函数名 END UP
...
MYCODE ENDS
END
3 C语言汇编语言需要调用其它子程序的语言格式
把被调用程序其格式和普通汇编语言程序分布情况加以比较能够发现:
因为C语言程序和进行汇编的子程序需要共用同一个程序运行区间,所以在刚刚开始进行子程序的C语言汇编时就需要运行PUSH BP和MOVE BO,SP这两个命令。
必须要把将会被修改和汇编到C语言程序中的子程序进行局部调用的PUBLTC操作,通过进行PUBLTC的操作来表示该段C语言子程序已经参与到其他的操作中,被其他程序所调用了。
虽然已经被调用的子程序会接受程序的控制,但也需要对该段子程序利用SI和DI进行局部变量的保存,但是仅在变量高于120分钟时,才能将其在堆栈当中加以存放。因此,这一模式进行过程中,我们可以清楚的看到PUSH DI还有PUSH SI的语句。
在经过汇编的程序C语言中,要把MYCODE的代码段、初始数据段、修改数据段进行分别的定义,并且把这几个分段的汇编程序组合成为一个有效段组,保证该段段组基址的共用性。
在汇编之后的程序语句之前必须要增加一段函数值语句,保证语句可以有效的返回,进行下一段的程序循环,并且设置的返回值要在RET语句的前方。
值得注意的是,不同意调用过的子程序必须要用RET的命令增加返回功能,并且在结束语句后编辑结束END。这个END语句代表的是最终的终止,没有相应的启动功能。
通过C语言子程序的汇编,可以有效的保证其调用功能,同时也节省了相应的程序编辑空间。例如在程序输入时,不用修改程序的进位制就能准确的进行数据的读取,也就是说参与汇编的C语言子程序在格式上不会有太大的改变,只需要在原本子程序的起始部位增加相应的语句就可以了。
EXTERN 函数名,主要作用是为了反应出这个函数是C语言的子程序,且是外部调用的、。原本的主程序语句,可以利用外部程序来实现原本语句的调用功能,具体的调用格式如下:CALL NEAR PTR 函数名,而在将C语言程序当做是子程序的过程中,只包含有C函数,并不需要EXTERN来进行进一步的说明。
4 连接两种语言
由于汇编语言和C语言二者均存在着一定的问题,通过将两种语言混合编程,能够弥补两种语言各自存在的不足,因此,下面阐述如何连接这两种语言。
4.1 传递参数
在调用C语言及汇编语言时,可能会存在汇编语言的参数传递问题,通常都是利用堆栈来进行传递,通常在汇编C语言的过程中,要把BP基址当作原数据的储存器,C语言的汇编参数全部储存在堆栈储存器当中,如果在需要使用储存参数时,可以把存储在堆栈当中的数据进行清除处理。
4.2 调用关系的确定
对于即将要调用的函数或者是过程,要在调用开始之前明确的说明,建立完整的调用关系,详细的说明被调用的子程序是属于那个外部过程当中的,并且被调用的子程序应用在什么模块当中。另外要根据调用模块和储存方式的不同,对被调用的C语言汇编子程序进行格式的确定,一般情况下被调用的在大模式下与原本程序类型基本相似,小模式下存在微小的变化
4.3 模块连接
原有的C语言模块想要和汇编C语言的模块进行准确的连接,就需要做到以下两点:
(1)原有C语言模块必须与汇编C语言模块的储存方式相同。
(2)要求汇编模块要遵守和C语言模块兼容的相同命名。
因为编译系统在编译C源程序的过程当中,将会在函数名以及变量名称的前面画有下划线,想要保证连接前后相同,全部被C语言调用的汇编子程序其标识符前面都要标记下划线。并且,想要使汇编语言的标识符在C语言当中能够看见,需要用PUBLIC来定义。要求汇编语言当中其C语言的变量以及函数,必须要在二者前面加上下划线,同时,要求汇编程序开头的所调用C函数以及变量必须要用EXTERN对其进行说明。
为了有效保证C语言及汇编语言二者混合情况下设计的程序标准,能够有效的实施,必须要保证主要参数在变成函数被调用的过程中具有有效的传递作用,并且要求针对程序设计具体的情况来确定两个语言之间相互调用的关系。
在C语言的程序当中包括六种储存形式,分别是微型和小型以及中型和金丑行,还有大型和巨型这六种储存的模式。通过这点我们可以知道,主要由空间的大小来区别储存模式。在这当中微型的储存模式其程序和蹲站都在同一段中,而小型的储存模式拥有数据以及代码段,详细的数量为同一个。如果想要混合编程,首先必须要保证这两个程序所使用的是一个储存模式,对于汇编语言来讲,Model表示程序当中用到的伪指令,之后需要连接的内容便是储存的模式,通常是上面所讲的储存模式当中的一种模式。若C语言程序所使用的储存模式是小型的,那么汇编语言当中就会表示成Model Small,并且在这个时候这两种程序使用的储存模式一定是相同的类型。因为小型储存模式将Near当做是基础指针,因此,这种储存模式其运行效率极高,所以说在实际混合编程的情况下,如果符合条件这种情况下最好选择小型储存模式。
在编译C语言的过程当中,在变量以及函数名称的下面将会添加下划线,为了保证连接的质量,调用子程序的过程当中,任何标识符其下方都应该添加下划线。站在C语言程序的角度去看,将会把所调用的对象其中实际的变量和函数作为伪命令,进而起到说明的作用。一般把命令放在函数和变量的外部。除此之外,由于想要保存汇编语言程序标示符的完整性,应该使用PUBLIC定义相应的标示符。
5 结束语
通过本文对汇编语言与C语言的混合程序设计技术的进一步阐述,使我们了解到在开发软件的过程当中使用这两种语言混合的程序设计的技术,能充分发挥两种语言各自的特点,扬长避短,大大提高了软件开发的效率,缩短开发的周期,达到事半功倍的效果。通过本文对二者之间混合程序设计技术的具体阐述,希望能够给使用汇编语言及C语言混合程序设计方面提供一定的帮助,对于我国软件开发方面起到促进的作用。
参考文献
[1]陈久娅.C语言与汇编语言的混合程序设计技术研究[J].电子制作,2013(04):61.
[2]康晶晶.汇编语言与C语言的混合程序设计技术[J].计算机时代,2013(06):1-2.
[3]印德彬.汇编语言与C语言的混合程序设计技术[J].电子技术与软件程,2015(02):254.
作者简介
杨波(1979-),女,侗族,贵州省凯里市人。理学学士学位。现为黔东南民族职业技术学院汽车与机电工程系讲师。主要研究方向为软件开发。
1现状及发展趋势
大多数高等院校计算机本科专业涉及的硬件教学课程主要有“数字逻辑”、“汇编语言程序设计”、“计算机组成原理”、“计算机系统结构”、“微机原理与接口技术”、“单片机”、“嵌入式系统”等,在新形势下部分课程内容设置显得不够合理,部分教学内容与实际应用脱节,影响了教学效果,无法完全满足教学大纲中要求的动手能力培养,更无法有效培养同学们的创新意识。目前,作为计算机教学重要专业基础课程的“数字逻辑”,要求学生掌握组合逻辑、时序逻辑电路的分析和设计方法,研究对象主要是分立元件、通用中小规模集成电路及基本的可编程器件等,介绍的方法也以传统方法为主,已无法适应目前应用的需要;作为专业主干课程的“计算机组成原理”、“计算机系统结构”,主要内容是讨论计算机的结构、各功能部件原理及设计方法,同时介绍当前的新技术、新方法,目的是让同学们熟悉计算机的结构,为以后应用和设计计算机系统打下基础。目前大家普遍采用的教材在部件设计中讨论的方法主要是硬布线逻辑或微程序设计方法:硬布线逻辑运行速度高,但缺乏灵活性;微程序设计方法有一定的灵活性,但资源占用多,运行速度慢。尽管这两种方法对于理解计算机组成原理不失为一种较好的选择,但由于缺乏实际应用背景,学生学习兴趣受到影响,教学效果也大打折扣,提高学生的动手能力、培养创新意识更是无从谈起。
“汇编语言程序设计”课程也存在类似尴尬,讨论以16位个人计算机为背景的汇编语言程序设计知识,适合入门和了解基本原理,但与“计算机组成原理”、“计算机系统结构”课程一样,由于缺乏实际应用背景,教学目标无法完全实现。随着电子设计自动化(EDA)、系统编程(ISP)、片上系统(SOC)等技术的发展,32位个人计算机的应用已很成熟,多核64位计算机应用也将逐步成为主流。嵌入式系统设计需要较强的软硬件知识综合应用能力,因此在计算机硬件课程的教学中应加大相关新技术的比例,并根据实际及时调整教学内容。国外许多知名高校本科专业的教学内容已经作了适时调整,如麻省理工学院非常注重学生的设计能力的培养,为此专门开设了“计算机系统设计”课程,要求学生在实践环节中自主设计ALU、单指令周期CPU、多指令周期CPU乃至流水线32位MipsCPU和Cache;斯坦福大学也有相似的课程和实验环节;加州大学伯克利分校和杨百翰大学在基于可编程逻辑的超级计算机研制方面也有大量成果。当前在国内,案例教学已被越来越多的人所接受,尤其是在一些法学、工商管理类高校已经开始广泛运用。案例教学法是一种动态的、开放的教学方法,目标是解决学生如何用更有效的方式获得知识以提高应用能力的问题。案例教学法具有综合性、交互性、启发性、针对性和可操作性等多种特征,它的使用大大缩短了教学理论与实际应用之间的差距,同时对教师的教学观念产生了重大的影响。鉴于计算机专业知识与实际应用结合紧密的特点,教学中尤其适合案例式教学。目前在国内计算机课程的教学中,案例教学还处于一个起步阶段,主要表现在:案例教学比例不够,没有形成完整的体系;案例数量不足,质量欠缺;许多高校尽管重视案例教学的应用,但是在案例的搜集、整理与分析等方面相对滞后;案例陈旧,缺乏代表性等。
2以ISP技术为主线改革计算机专业硬件课程教学体系和教学内容
计算机本科专业涉及的硬件教学课程按合理教学顺序一般为“数字逻辑”、“汇编语言程序设计”、“计算机组成原理”、“计算机系统结构”、“微机原理与接口技术”、“单片机”、“嵌入式系统”等,一些课程可以在时间上重叠,如“数字逻辑”、“汇编语言程序设计”等。由于ISP、EDA技术可以灵活地开发出具有自主知识产权的硬件产品,是目前工程实践领域和芯片设计领域运用最广泛也是最有应用前景的技术,因此在计算机硬件课程的教学中应该把相关技术列为重要内容,即以ISP、SOC技术为主线,使相关课程形成一个完整的体系,达到培养创新性人才的目的。为了实现这一目标,在“数字逻辑”课程中,应大幅增加可编程逻辑技术的比重,重点讨论用EDA方法,利用ISP技术、SOC技术设计IP核的方法,使学生对相关技术的应用及发展趋势有一个全面的理解,并具备基本的实践能力;在“计算机组成原理”课程中增加计算机设计原理和实践的内容,也可考虑再单独增加一门计算机设计课程以替代目前“计算机组成原理”课程设计,在该课程中重点讨论如何采用EDA方法,利用ISP技术、SOC技术设计计算机各部件如CPU、Cache等,通过实际应用和实践进一步加深对相关技术的理解和掌握。在“微机原理与接口技术”课程可以考虑以16位计算机应用知识入门,以讨论32位计算机的应用为重点。相应的,作为“微机原理与接口技术”课程的先行课程,“汇编语言程序设计”课程也应把相应的内容整体提升到32位,考虑到学习过程的先易后难,可以先介绍16位汇编语言程序设计知识作为入门,再对32位汇编语言程序设计相关内容展开。
单片机系统本质上也是嵌入式系统,嵌入式系统是针对应用或用户定制的完整、高效的计算机系统,嵌入式系统设计需要较强的操作系统原理、应用程序设计和硬件设计方面知识的综合应用能力,其别是硬件系统设计能力可以通过以上几门硬件课程的系统学习逐步培养,因此相关课程的教学内容应注意衔接,同时遵循先易后难的原则,面向实际应用,以提高动手能力、增强创新意识为目的。针对实践教学,目前相关课程的实验教学的实验项目及内容固定,大多为验证性实验,实验步骤程式化,许多同学按教学实验计划做完实验,仍然无法充分理解课程的主要内容,无法真正拥有教学大纲所要求的动手能力。更重要的是计算机技术一直处于高速发展中,高等院校的计算机教学理应不断地适应这种要求,相关的实验教学应适时地调整教学内容。解决问题的一个好思路是利用ISP、SOC技术开发出一种内容可定制的硬件课程教学实验平台,由于作为控制对象的电路是相同或相近的,可以设计为通用模块,而实验平台控制部分则可以利用可编程逻辑改变,以适应不同的课程。如控制部分设计为基本CPU即可做“计算机组成原理”课程的相关实验;控制部分设计为单片机即可做“单片机”课程的相关实验;甚至控制部分可以设计为个人计算机CPU,配合有关的接口电路,即可做“微机原理与接口技术”课程的相关实验等。在我院的计算机本科专业相关硬件课程教学实践中,我们已作出了一些有益的探索,如我院“数字逻辑”教学大纲已在近年作过相应调整,EDA技术、可编程技术的理论和实践教学内容的比例从原来的20%增加到60%以上,经过多年的建设,“数字逻辑”课程在今年被评定为“湖北省精品课程”;在“计算机组成原理”课程中引入利用ISP技术设计CPU软核等教学和实践内容;“汇编语言程序设计”、“微机原理与接口技术”课程中也增加了32位计算机相关内容的学习和讨论,新的实验设备可以进行32位的相关实验等,这些安排增强了学生的学习兴趣,学生学习的主动性也明显提高了。
3采用案例教学法作为计算机专业硬件课程教学的主要方法
案例教学法是一种事半功倍的教学方法,在教学过程中围绕事先精选的典型的、具有工程背景的实际案例进行讨论,可以为同学们模拟实际应用的场景,获得近似于实战的经验。为完成设计目标,同学们自然会自己主动学习,在这一过程中掌握知识,并学会应用知识,提高解决问题的能力;也能通过用不同的途径解决问题,培养创新意识。这样教师在授课中可以把精力集中于教学内容的总体把握上,而不需要过分在知识细节上消耗时间,提高了教学效率。案例教学法关键在于选择合适的案例,案例首先必须有代表性和实时性,必须是实践中的典型应用实例。在实践中应用的几率高,具有普遍意义,这样的实例在教学过程中值得花费精力讨论和设计,才是有意义的。同样重要的是案例需具有实际工程背景,学生可以面对具体的实际问题和特定的环境,有针对性地通过自主学习和思考进行设计,培养实际解决问题的能力。案例还应该形成相对固定的案例集,并具备一定的开放性,应定期对案例集进行评估,剔除一些过时的案例,增加一些新的典型应用实例。这样就保证了案例的典型性、实时性及工程背景。在教学实践中,我们把案例教学法作为主要方法,并把案例分为4类:一是问题评论型,给出问题和解决问题的方案,让学生去评价;二是分析实现型,不给出解决方案,要求学生讨论分析以提出方案;三是实际模拟型,是指在教学过程中依据教学内容,让学生分别充当不同的角色,进行模拟性的实践活动;四是发展开放型,通过案例发现新的理论生长点,讨论相关理论的发展趋势。我院在相关课堂教学中采用的部分案例如表1所示。在“数字逻辑”、“计算机组成原理”等课程的重点章节教学中,我们通过采用上述案例法,调动学生成为积极参与者,而不是消极被动的听众,在案例学习和讨论中,鼓励学生提出更多解决问题的办法,在课堂上营造出积极发表意见和争论的气氛。这样提高了学生的学习兴趣,教学效果有明显改善,学生的动手能力有了显著增强。
4总结
为实现面向实际应用提高学生动手能力、增强创新意识、培养创新型人才、确定完整合理的计算机本科专业硬件理论教学和实践教学体系的目的,我们提出了以ISP技术为主线的计算机专业硬件课程教学改革方案。它的主要内容为两方面:一是调整现有教学体系和教学内容,如在“数字逻辑”、“计算机组成原理和系统结构”、“嵌入式系统设计”等课程中以“数字逻辑”课程为先导,以ISP、SOC技术为主线贯穿于各相关课程教学过程中;在“汇编语言程序设计”、“微机原理与接口技术”等课程中把主要内容全面提升到32位等。二是在教学中运用案例法,使学生成为教学活动的主体,形成学生自主学习、合作学习、研究性学习和探索性学习的开放型学习氛围。充分发挥案例教学有利于提高学生分析问题和解决实际问题的能力、有利于促使学生学会学习、有利于促使学生学会沟通与合作的优势。实践表明以ISP技术为主线的计算机专业硬件课程教学改革,符合国家高等质量工程建设中培养创新性人才的规划,有效地增强了学生的动手能力和创新意识。我们也意识到计算机工程教学是一个复杂的过程,牵涉到许多方面,我们将在实践中探索教学规律,不断提高教学水平,进一步改善教学效果。
关键词:高效;空间;位;嵌入
中图分类号:G623.58
C语言程序设计方法多种多样,一般以根据实际情况选择程序设计方法。现根据不同情况说明几种不同的高效编程方法。
1.以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:
方法A:通常的办法
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is a example!!");
方法B:
const char string2[LEN] ="This is a example!";
char * cp;
cp = string2 ;
使用的时候可以直接用指针来操作。
从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下:
方法C:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U
}
void SET_BITS(int __dst,
int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) |
/
(((__val)
& (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);
方法D:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf)
(((1U
#define SET_BITS(__dst, __bf, __val)
/
((__dst) = ((__dst) & ~(BIT_MASK(__bf)))
| /
(((__val)
& (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS,
RegisterNumber);
函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。
而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。
D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。
2.数学方法解决问题
现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
3.使用位操作
实现高效的C语言编写的第三招--使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。
运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。
4.汇编嵌入
高效C语言编程的必杀技,第四招--嵌入汇编。"在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。
建议不轻易使用此种方法,因为使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,存在安全隐患!同时此种方法也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。
参考文献:
[1].《C语言趣味程序百例精解》,陈朔鹰 陈英主编,北京理工大学出版社,1996年。
[2].《Turbo C 2.0实用大全》,常玉龙等编写,北京航空航天大学出版社,1994年9月。