导航菜单

汇编语言实验教学与实践

刁红军,杨季文

(苏州大学计算机科学与技术学院,江苏苏州215006)

摘要:分析汇编程序实验课中碰到的若干问题,提出在VC++开发工具中嵌入汇编,在汇编程序中采用结构化程序方法、借助反汇编进一步学习高级语言、以实际应用激发学生学习兴趣3个教学实践,为汇编语言实验教学提供参考。

教育期刊网 http://www.jyqkw.com
关键词 :汇编语言;程序设计;反汇编

文章编号:1672-5913(2015)15-0097-03

中图分类号:G642

基金项目:国家级计算机与信息技术实验教学中心资助项目( 50118003)。

第一作者简介:刁红军,男,实验师,研究方向为中文信息处理、机器学习,hjdiao@suda.edu.cn。

1 背景

汇编语言是一种面向机器的程序设计语言,在高等院校计算机专业的学科中,是一门软件与硬件相结合的基础课程。通过汇编语言,在硬件方面可以了解CPU、BIOS等编程结构,在软件方面可以理解操作系统、编译原理等底层操作。因此,学生学好汇编语言程序设计,不但能更好地掌握计算机工作原理、微机编程接口,还能进一步加深对操作系统和高级语言的理解。

2 汇编语言实验课程现状

(1)汇编语言编辑编译麻烦。学生早已习惯了C++/Java等高级语言的可视化集成式开发环境,而汇编实验还采用MASM、LINK等命令行编译连接工具,汇编程序书写时也不像高级语言那样具有上下文智能提示功能的编辑工具,对用惯了高级语言编程工具的学生来说,命令行编译连接工具给汇编实验入门带来一定的困难。

(2)汇编语言程序编写繁琐。汇编语言是面向机器的语言,汇编指令与机器指令之间存在着密切的关系,因此其语言表达能力和方式受限于机器的指令系统。书写汇编程序不仅需要在程序逻辑上花费精力,还要在内存分配、寻址和访问上投入甚多,相比于高级语言,其书写繁琐很多。就拿C语言中经典的“Hello World”程序做比较,在80×86汇编程序中,首先要定义存放字符串的数据段并为其字符串存储空间,然后定义堆栈段,再定义代码段以及汇编编译指令和代码指令,不但汇编语句比高级语言繁琐,程序结构也比高级语言冗长。

(3)汇编语言程序调试困难。汇编语言提供给程序员很大的访问机器资源的“能力”和程序设计的灵活性,学生在汇编程序中可以通过各种技巧使用资源。因此,在调试程序的时候,不仅要正确理解当前指令的含义,还要清楚指令中使用到的资源的状态以及指令执行完对资源的影响。汇编语言的调试工具也不像Java/C#等高级语言那样,有智能化的表达式监控窗口以及调试步骤回退功能。

(4)汇编语言结构条理性差。高级语言中任何程序逻辑都是由顺序、分支、循环3种结构组合而成,而且3种结构进行嵌套时都通过分层次缩进的方式进行对齐。然而在汇编程序中一方面没有定义这3种逻辑结构的规范,另一方面汇编程序书写是一行一条语句,语句与语句之间按行对齐,并不按嵌套缩进的方式对齐。因此,学生在写汇编程序时自由度比较高,分支和循环在汇编中只能通过各种转移指令实现,如果这些转移指令使用不规范,不但使程序的可读性很差,而且导致整个程序结构很凌乱,从而演变为“面条式”代码。

3 汇编实验改进实践

3.1 VC++开发工具中嵌入汇编语言

为了降低学生汇编实验入门的门槛,教师可以采用学生熟悉的VC++编程工具,以C语言嵌入汇编语句的方式先开展汇编实验。例如,设X和y均为16位无符号数,用加法指令实现求解表达式SX+Y值的程序。用C语言嵌入汇编语言的代码如图1所示。

在C语言中嵌入汇编语言比书写完整的汇编程序在结构上要简单很多,学生可以把重点放在汇编指令和寻址方式的学习上,通过这种实验方式也教会了学生用C语言和汇编语言编写混合程序的方法。等学生熟悉并掌握了完整的汇编语言书写格式后,再使用命令行的编译和连接工具进行汇编实验。

3.2 在汇编程序中采用结构化程序方法

随着汇编实验的开展,汇编实验越来越难,汇编程序逻辑也越来越复杂。如果这个时候学生不能养成良好的编程风格,势必会造成程序代码混乱、汇编实验效率低下的问题。因此,教师可以在汇编教学实验中引入高级语言中的结构化程序设计的方法,让学生严格按照结构化的套路设计程序,例如,写一个把字符串中的所有大写字母改成小写字母的程序。字符串大写转小写的流程如图2所示。

字符大写转小写流程的逻辑结构由while循环和在while循环中内嵌的一个单分支结构构成。因此,在编写上述程序时可以用汇编语句先构造while循环结构,再在while循环结构中嵌入单分支结构,其他的顺序性汇编代码只要填写到相应的结构中就可以了。两种结构的代码如图3所示,这样整个程序就可以按结构化方式进行设计了。这样不但提高了学生编写程序的效率,还进一步加强了学生对高级语言中的各种分支和循环结构在编译器层面的理解。

3.3 借助反汇编进一步学习高级语言

结构化汇编程序设计让学生初步了解了分支和循环等结构在编译器层面的实现。利用汇编或反汇编输出,学生们还可以进一步了解高级语言中一些特性在编译层面的实现。例如,关于C语言程序中局部静态和动态变量编译实现上的区别,事例C语言代码经汇编输出后如图4所示。

从图4中可以看出“a=3”转换为汇编语言后对变量a采用直接寻址,而“_?a@?l??main-@@9@4HA”这个字符串是在段名为“BBS”的数据段中定义的,代码如图5所示。

“b=4”转换为汇编语言后对变量b采用寄存器相对寻址,“b$”被定义为常量,其值为-4,而“ebp”则是程序调用栈基址指针。因此,从汇编后的代码中学生可以看出局部静态变量存放在数据段中,函数执行结束后其存储空间不会被回收,而局部动态变量则存放在程序调用栈中,函数执行结束后其存储空间则被调用栈调整出去。学生通过对高级语言汇编或反汇编输出,还能进一步了解关于一维数组的指针和一维数组首地址的指针以及类中普通成员函数和虚函数等编译层面的区别。

3.4 以实际应用激发学生学习兴趣

兴趣是学习最好的导师,教师要通过有应用价值的实例激发学生学习的兴趣,让学生了解汇编语言的用武之地,例如,可以向学生讲解硬件驱动、屏幕取词、单片机开发、缓冲区溢出攻击的原理;同时让学生写一些简单而力所能及的小程序,如基于280单片机的电子广告牌控制程序,这样一方面提高学生汇编实验的动手能力,另一方面也加深了学生对操作系统、微机接口等相关课程的理解。

4 结语

实践结果表明,与往届学生汇编实验情况对比,使用C语言中嵌入汇编代码方式的学生能很快上手开展汇编实验,明显降低了学生汇编实验入门的门槛,提高了学生汇编实验的效率;通过汇编程序中采用结构化程序的方法,学生能快速写出多重嵌套的汇编程序,能明显增强学生阅读和编写复杂汇编程序的能力;借助反汇编学习高级语言只能提高基础知识较好的学生各科知识点串联和贯通的程度,部分学生由于基础知识较差,融会贯通多科知识点还较困难;以实际应用激励学生也只能让少部分可以静下心来刻苦钻研的学生比较感兴趣,部分学生感觉题目综合性强,涉及知识点多,课后不认真钻研,很容易就会对实际应用失去兴趣。经过多方面尝试,教学虽然取得一定的效果,也暴露出一些不足,这些也成为我们汇编教学和实验中需继续思考和解决的问题。

教育期刊网 http://www.jyqkw.com
参考文献:

[1]张洪业,宋人杰,周欣欣,“汇编语言”教学改革与实践[J].计算机教育,2009(21): 60-61.

[2]沈美明,温冬婵.IBM-PC汇编语言程序设计[M],北京:清华大学出版社,2001: 50-52.

[3]杨季文,钱培德.80×86汇编语言程序设计教程[M].北京:清华大学出版社,1998: 98-99.

(编辑:孙怡铭)

下载文本