陈松
【摘 要】通过对汇编语言的学习,计算机专业的学生可以更好地理解计算机的工作原理,提高程序设计的能力。然而目前计算机实际应用编程中,更多采用计算机高级语言,汇编语言应用较少,学生入门也比较困难,本文根据长期教学实践,对该门课程的教学工作进行了一些有益的反思与探索。
【关键词】汇编语言;教学研究;实验设计
中图分类号:G434 文献标识码: A 文章编号: 2095-2457(2018)17-0068-002
DOI:10.19694/j.cnki.issn2095-2457.2018.17.033
【Abstract】Through the assembly language learning, computer professional students can better understand the working principle of the computer, improve the ability to program design. However, the practical application of computer programming, using more advanced computer language, assembly language is used less, student entry is difficult, according to the long-term teaching practice, has made some useful exploration and Reflection on the teaching of this course work.
【Key words】Assembly language; Teaching research; Experimental design
0 引言
早期的计算机专业教学中,汇编语言曾经占据着很重要的地位,一直被认为是理解计算机工作原理必不可少的一门工具性语言,在实际应用中也曾经非常流行。然而今非昔比,相对于后来诞生的一系列计算机高级语言而言,汇编语言的缺点也非常明显,语法细节较多,难以记忆,程序可读性差,不易调试与维护,可移植性差,开发时间长且效率低,在实际编程中的应用越来越少,更侧重于计算机底层硬件的交互,是编写操作系统核心的工具语言。
然而作为一门面向计算机硬件的语言,汇编语言有其不可替代的作用,仍然应该作为计算机专业学生必修的课程之一。
1 教学指导思想及教学内容调整
对于学生而言,使用汇编语言来编程解决纯软件的问题,往往效率不高,特别是输入输出环节较为繁琐。对于计算机初学者而言,汇编语言的实际应用也偏少,很多时候软件编程是通过C、C++、VB、JAVA等高级语言来实现的。目前在计算机专业的本科教学中,汇编语言往往不是作为一门单独课程来教学,而是嵌入到微机原理与接口技术课程中,作为一门工具语言来学习。因此,学习汇编语言的目的不再是熟练运用汇编语言,而是可以更好地理解高级语言的实现,更好地理解计算机底层硬件的工作过程,从而提高对计算机系统的整体认识,提高程序设计开发的能力。
教学指导思想的调整,同时意味着教学内容及教学重难点的调整。目前我校的汇编语言是放在微机原理与接口技术课程中介绍。由于课时有限,汇编语言的课堂教学内容进行了删减,只介绍寻址方式、与后续程序结构实现有关及与接口编程有关的指令。教学过程中淡化了对复杂问题的编程解决,而侧重于介绍规律性的知识;侧重于介绍汇編语言顺序结构、分支结构、循环结构及子程序结构的实现语句,并与高级语言程序结构进行对比;侧重于汇编语言在接口编程中的使用,以突出汇编语言的优势。对汇编语言与高级语言中输入输出环节进行了对比,学生可以理解字符编码的使用,可以理解高级语言是通过语言自带函数来处理字符编码与不同数据类型间的转化。对于课堂上未介绍到的内容,则鼓励学生通过MOOC、阅读参考资料、搜集网络资源进行自学,并在通过实验检验学生的学习效果。
2 实验教学设计
实验环节设计。实验分为基础实验、提高性实验、硬件实验。基础实验,例如通过DEBUG调试工具认识不同寻址方式的机器代码,从而学生可以理解什么是立即数,什么是内存操作数。在汇编语言程序设计实验中,将源程序与反汇编的结果进行对比,如图1。学生可以认识到指令与伪指令的区别,可以看到可执行文件中没有伪指令,段名DATA处理为立即数07A6H,变量名STR1处理为数值地址[0000H]。
提高性实验,可以采用课程设计的方式,分组完成实验。给定题目,具体实现效果由学生自行决定。课时有限时,也可通过一个综合实验考查学生编程能力,如主程序中设计界面,输入符合要求,调用子程序实现某项功能,输入不符合要求时,则给出相应提示信息。该实验难度弹性较大,有的学生自学能力比较强,可以实现输入字符串密码,对字符串密码进行比较,并考虑利用循环结构控制密码输入的次数,子程序则实现冒泡排序算法;基础比较薄弱的学生,则可以实现单个字符的比较,子程序可以实现数据的二进制形式输出等。教师可以根据学生的学习情况,提出不同要求,有利于学生学习兴趣的提升。
硬件实验的设计,主要结合了接口部分的内容。例如接口扩展实验,8253实验,8255实验等。这些实验的完成不仅需要学生具备汇编语言的编程基础,还需要掌握接口芯片的功能,特别是理解软硬件之间的关联。
3 教学中遇到的问题及解决方法
DEBUG调试工具使用繁琐。目前的解决方法,一是使用仿真软件的集成环境,简化操作过程。例如Proteus 8.0及以上版本,就可以支持对8086系统的仿真,可以完成汇编程序的编程及调试。二是可以使用Masm for Windows集成实验环境,同样也很方便。不过这些方法都是对原有汇编程序编写、调试、运行环境的仿真和集成,从理解计算机工作原理的角度看,学生仍然应该对DEBUG调试工具有所了解,注意对存储器内容和地址的理解,可以把多种实验方法结合起来进行教学。
教材中汇编语言编程存在细节缺失的问题。由于汇编语言在实际工作中使用面越来越小,主要是在操作系统内核及外设的驱动程序中使用,普及率降低,教材中对汇编语言的介绍也偏向于基础知识、常用指令的介绍,有些细节就被省略了。而在实验过程中,这些缺失的细节会对结果产生影响。大部分教材中,对DOS系统功能调用介绍的都比较简单,因此学生在实验中就出现了一些问题。如编程完成键入一个大写字母,转化成小写字母输出,指令如图2所示,通过DOS系统功能调用可实现,1号功能输入单个字符,加上20H完成转换,最后用2号功能输出单个字符,运行结果如图3。有学生对程序进行优化,增加了9号功能输出字符串,做一个简单界面,代码如图4,但运行结果与期望不符,无论输入什么字符,输出总是为“D”,如图5。原因何在?通过DEBUG调试发现,执行完9号功能后,系统将AL值改为24H,加上20H后正好是“D”的ASCII码,如图6,即9号功能调用会改变AL的值,从而使最终结果发生改变。这一点在教材中未有提及。了解原因后,只需要在9号功能使用的前后注意对AL的保护与恢复,就能使程序达到预期结果。对于出现的类似问题,一般会引导学生通过对程序的调试,找到原因,思考解决问题的方法,授人以鱼不如授人以渔。
教学课时紧张。现在原理性的专业课课时进行了压缩,同时更强调实验,重在培养学生的动手能力。这样一来就不可能很深入地介绍汇编语言。学生在实验过程中不可避免地出现了很多问题。因此学生的学习目标、学习要求就要进行相应的调整。实验的设计应该由浅入深,具体内容可以分层次完成。例如在子程序的设计与实现中,布置的题目是求N的阶乘,将此功能作为一个子程序,在主程序中完成数据的输入与输出。最低要求可以实现0~9的阶乘计算,中等要求在实现程序基本功能的基础上,对结果进行分析,提出改进思路,最高要求可以实现0~255的阶乘计算。学生可以根据自身情况,选择不同的完成要求。
4 总结
目前的汇编语言教学应该侧重于基础知识的介绍,同时可以注意与高级语言的对应关系,学生的学习目的是通过对该门语言的学习,了解计算机底层解决问题的思路和方法,理解计算机的工作原理,掌握对接口的编程方法等。同时,也应为感兴趣及学有余力的学生留有余地,有条件地因材施教。
【参考文献】
[1]周荷琴,冯焕清.微型计算机原理与接口技术[M].合肥:中国科学技术大学出版社,2013:48-154.
[2]詹林,刘向举.汇编语言程序设计课程教学犯法[J].科技经济导刊,2016(31):189.
[3]刁紅军,杨季文.汇编语言实验教学与实践[J].计算机教育,2015(15):97-99.