计算机专业基于系统观的汇编语言课程教学探讨
2017-09-28何健苏守宝莫晓晖
何健++苏守宝++莫晓晖
摘 要:汇编语言是计算机专业知识架构中不可或缺的一个环节,但在实际教学过程中,汇编语言程序设计课程却长期被认为是难学、难教、枯燥、无用的课程。针对上述问题,文章分析计算机系统能力培养的需求,调整教学培养目标,在理论和实践教学中建立课程间关联,提高学生学习的主动性和积极性。
关键词:系统能力;汇编语言;本科计算机专业
1 背 景
教育部计算机专业教学指导分委员会对计算机专业学生的能力培养和实践教学体系开展了研究,研究提出:①在教学中必须树立学生的系统观,培养学生的系统能力,使学生学会站在不同层面把握不同层次的系统,并全面考虑系统各部分及其与外界的逻辑与联系,完成一定规模的系统设计;②计算机专业基本能力包括计算思维能力、算法设计与分析能力、程序设计与实现能力以及系统能力,其中系统能力占总能力的75%,包括系统认知、系统设计、系统开发和系统应用能力[1-3]。然而,文献[4]通过分析近年来研究生招生考试中计算机专业综合统考各门课程试卷难度,特别是组成原理课程试卷考试结果,得出了国内本科计算机专业教学中存在“轻应用、缺关联、少综合、无系统观”等问题的结论。针对上述问题,目前国内越来越多的高校展开了相关的研究与探索。
一个计算机系统是由相关硬件和软件采用层次化方式搭建的,从底向上分别包括器件层、门电路层、功能部件/寄存器传送级(RTL)层、微体系结构层、操作系统/虚拟机层、程序(程序语言)层、算法层以及应用(问题)层[5],见图1。各层知识之间是紧密相关的。图1中“指令集体系结构(ISA)”抽象层定义了一台计算机可以执行的所有指令的集合,但是常人难以掌握和理解机器指令,而汇编语言的指令与机器指令是一一对应的。因此,汇编语言是学生理解处理器指令集的一个主要途径,是计算机专业知识架构中不可或缺的一环。
在汇编语言的教学过程中,学生普遍反映该课程需要死记硬背的内容太多,既抽象难懂,又枯燥难学[6]。另外,由于汇编语言指令与处理器的机器指令一一对应,因而汇编语言程序的通用性和可移植性较差。同时,汇编语言的指令只能完成比较简单的操作,且涉及硬件细节,导致编写程序比较繁琐,调试起来比较困难。鉴于汇编语言的上述两个缺点,目前,在实际应用软件开发过程中极少使用汇编语言。那么,在本科高校计算机专业教学中如何组织、开展汇编语言的教学才能让学生感到真正“有用”?
2 调整培养目标
汇编语言的相关知识对计算机类诸如软件工程、网络工程等专业和方向的学生来说,按照系统能力培养的要求,并不要求掌握汇编语言程序设计的技术与方法,只需对汇编语言有一个基本的掌握,能够读懂汇编语言编写的程序即可。但是对计算机科学与技术专业,特别是嵌入式方向的学生来说,不但必须要了解汇编语言的相关指令以及寻址方式等基本知识,还应熟练掌握汇编语言程序设计的技术与方法。因此,汇编语言相关课程必须针对不同的需求做出必要的调整,具体调整方案如下。
首先,取消汇编语言程序设计课程,用针对系统能力培养的特色课程——计算机系统基础替代。计算机系统基础课程的内容是以高级语言程序的开发和运行为主线,将该过程中每个环节涉及的硬件和软件的基本概念关联起来,使学生建立一个完整的计算机系统层次结构框架,了解计算机系统的全貌和相关知识体系,初步理解计算机系统中的每一个抽象层及其相互转换关系[7]。该课程使用14个课内理论学时讲授汇编语言的相关知识,包括汇编语言基本指令、程序各类控制语句对应的机器级代码的结构、可执行目标代码中的指令序列在机器的执行过程、存储访问过程等。该课程要求学生能够对照C语言源程序,分析目标代码反汇编后得到的汇编语言程序,并能够单步跟踪调试汇编程序,从而对指令在硬件上的执行过程和指令的底层硬件执行机制有一定的认识和理解。
其次,计算机科学与技术专业,特别是嵌入式方向的学生,需要使用汇编语言进行系统软件开发、无操作系统编程等,教学计划的专业课程里应开设嵌入式系统开发与设计课程。该课程以ARM芯片为核心,教授学生嵌入式系统中软硬件开发的方法与技术。该课程使用18个课内学时以及20个实践学时讲授ARM指令集,基于ARM处理器的汇编语言程序设计、Bootloader、接口通讯程序等底层软件的开发与设计技术。学生通过学习这门课程的相应环节即可较好地掌握汇编语言程序设计技术,并利用汇编语言完成一些底层软件的开发与设计。以应用为驱动开展教学,学生的学习目的非常明确,积极性和主动性也显著提高。另外,学生通过计算机系统基础课程的学习,对汇编语言有了一定的了解,在进入嵌入式系统开发与设计课程中再次学习汇编语言以及汇编语言的程序设计时也感觉比较轻松,易于掌握。
要开展基于系统能力培养的计算机专业教学,关键在于建立各门课程之间的关联,在课程之间构成输入输出关系,见图2。在硬件课程群中,数字逻辑课程要求学生能够掌握加法器、ALU、控制器、存储器等部件的搭建实现。后续的SOC原理与应用课程则在这个基础上,让学生掌握单周期CPU的实现,乃至多周期多级流水CPU的实现。其后的计算机组成原理、嵌入式系统等课程则扩充主存、搭建接口,从而构建一台完整的计算机硬件平台。操作系统、计算机网络、编译原理等课程则在上述硬件平台上安装配置操作系统,搭建网络接口,增设网络模块,直至运行简单的应用程序[8]。学生在完成了基础课程的学习后,首先通过计算机系统基础课程的学习初步建立起一个整体的认识,并了解计算机专业各门课程的学习目标及其关系,从而为后续学习打下扎实的基础;然后,学生在各课程群中层层递进,以螺旋上升的方式展开学习;最后,在嵌入式系统应用与开发课程中将前面所学的所有知识整合起来,学习设计一个完整的计算机系统。在这个课程体系中,汇编语言相关知识的讲授与学习在计算机系统基础和计算机系统基础两门课程中完成。计算机系统基础课程讲解汇编语言的入门和基础,重点是建立汇编语言相关知识与其他課程之间的关联;计算机系统基础课程讲解汇编语言的提高与深入,重点应放在系统软件和应用程序的开发与设计上。endprint
3 理论教学内容的改革
在计算机系统基础课程中开展汇编语言教学时,其教学重点不应放在程序设计方面,而应放在与其他课程的关联上,而关联主要通过适当的案例教学实现。
分析图3的C语言源程序可以看出,当参数len为0时,返回值应该是0,但是在执行时,却发生了存储器访问异常。从高级语言程序设计的角度分析,由于变量len的类型被定义为unsigned(无符号数),当len=0时,表达式len-1出错,但无法解释为什么出现存储器访问异常。将该程序的目标代码反汇编成汇编指令程序后,问题就容易解释了。分析如图3的汇编程序,变量i存于寄存器eax中,变量len存于edx中,初始值都为00000000H;减法subl指令实现len-1的功能,该指令执行完后edx中的值改为FFFFFFFFH;比较指令cmpl执行完成后,各条件标志位分别为CF=1, ZF=0, OF=0, SF=0;由于len的类型定义为无符号数,因此编译器选用的条件转移指令是jbe,jbe跳转的条件为CF=1或ZF=1,此时条件满足,跳转到L3处进入循环执行。也就是说,由于len是无符号数,使数据FFFFFFFFH被当成无符号数对待,其真值为4294967295,满足循环条件,由于其值太大,循环次数过多,使变量i的值变得过大,从而使数组a[i]的下标变量溢出,即该程序访问到了其他程序甚至操作系统使用的内存区域,导致操作系统出于内存信息保护的需要而终止该程序的执行并给出存储器访问异常的提示。通过上述案例的学习,学生能够将汇编语言与C语言关联起来,使学生能够通过分析汇编语言程序而对高级语言的编程有更深层次的理解和掌握。
同理,通过将C语言源程序中定义的各类数据结构与该程序对应的汇编语言程序中的数据定义以及存储器分配伪指令序列对照分析,学生了解了数据以及各种数据结构的机器级表示,从而将汇编语言与数据结构及算法关联起来;通过带领学生单步执行汇编语言程序中各条指令,观察各指令的执行情况,学生了解计算机系统的组成结构与工作原理,从而与计算机组成原理关联起来;通过观察和分析程序執行过程中产生的异常以及中断的过程等现象,学生了解操作系统对程序执行过程中的各种情况的处理手段,从而与计算机操作系统关联起来。通过这一系列的关联,学生切身体会到汇编语言知识的“用处”,提升了学生的学习兴趣,并能真正做到为后续课程打下扎实的基础。
4 实践环节的改革
以往的汇编语言实验都是验证性的实验和程序设计型的实验,目的是使学生通过验证性实验体会和掌握教师在理论课上讲述的内容,通过程序设计型实验提高学生的底层软件编程能力和技巧。基于系统能力培养的汇编语言实验教学注重与其他相关课程的关联。学生在完成C语言和数据结构课程的实验程序后,要求他们保存源程序和目标程序,在学生进入汇编语言的实验环节时,直接对上述目标代码进行反汇编,通过分析汇编指令和观察单步跟踪执行的情况,回答实验指导书提出的相关问题,从而实现汇编语言与学生已经完成的课程之间的关联。另外,教师通过实验指导书给学生提供一些与计算机组成原理、操作系统等课程相关的源程序,要求学生对其反汇编后再跟踪执行,观察其执行情况并回答问题,实现与后续课程的关联。
汇编语言的实验应尽量设置成问题解析型实验。所谓问题解析型实验就是教师给出一些C语言源程序,并针对程序提出相应问题,要求学生通过对程序反汇编并跟踪执行从而查出问题的答案。例如,实验指导书给出图4的两段C语言的程序代码,要求学生执行程序观察执行结果的差异,并提示学生通过反汇编这两个程序段,分析其对应的汇编指令序列找出问题出现的原因。学生通过执行两个程序段可以发现图4代码段一的运行结果为“-2147483648”,而代码段二的运行结果为“Floating point exception”。将2段源代码的目标代码反汇编后,分析其汇编指令就能发现,代码段二中的“a/b”是用除法指令IDIV实现的;而代码段一中的“a/-1”由于编译器的优化,转换为求补指令NEG实现。正是由于两段相同功能的源代码在目标代码中使用了不同的机器指令,导致最终结果各不相同。
这种问题解析型实验可以激发学生的探索欲望,提高其学习兴趣;而与其他相关课程的关联又可以使学生做到“学以致用”。那么,学生学习汇编语言态度不端正、积极性不高等问题也就迎刃而解了。
5 结 语
汇编语言是计算机专业知识体系中的重要组成部分,上与各类应用程序紧密相关,下与计算机硬件紧密相关,是学生深入了解和掌握计算机系统的构成和工作原理,使学生树立“系统观”的一个重要工具。只有针对不同的专业和方向、不同的需求,确定不同的培养目标,合理地组织教学内容,才能使学生明确学习的目的,提高其学习积极性,从而达到理想的教学效果。
参考文献:
[1] 教育部高等学校计算机科学与技术专业教学指导委员会.高等学校计算机科学与技术专业发展战略研究报告及规范[M]. 北京: 清华大学出版社, 2006.
[2] 教育部高等学校计算机科学与技术专业教学指导委员会.高等学校计算机科学与技术专业人才专业能力构成与培养[M]. 北京: 机械工业出版社, 2010.
[3] 王志英, 周兴社, 袁春风, 等. 计算机专业学生系统能力培养和系统课程体系设置研究[J]. 计算机教育, 2013 (9): 1-6.
[4] 袁春风, 陈睿. 从硕士研究生入学统考看高校计算机本科专业基础课教学[J]. 中国考试, 2013(1): 50-55.
[5] 袁春风, 王帅. 大学生计算机专业教育应重视“系统观”培养[J]. 中国大学教学, 2013 (12): 41-46.
[6] 张玲, 汤全武, 高志军.关于“汇编语言程序设计”课程的教学设计[J]. 电化教育研究, 2001 (6): 54-57.
[7] 袁春风. 计算机系统基础[M]. 北京: 机械工业出版社, 2014.
[8] 何健, 苏守宝, 朱俊, 等. 基于系统观的应用型本科计算机专业课程探讨[J]. 计算机教育, 2015 (21): 7-10.
(编辑:孙怡铭)endprint