“汇编语言程序设计”的比较教学法

时间:2022-09-30 11:22:52

“汇编语言程序设计”的比较教学法

摘要:基于比较教学法的优势,文章从数据安排、数据处理、流程控制、子程序结构等程序设计的基本方面对汇编语言和高级语言中的相关机制作了对比分析,提出了“汇编语言程序设计”比较教学的基本思路。

关键词:汇编语言程序设计;高级语言程序设计;比较教学法

“汇编语言程序设计”是计算机相关专业的一门重要课程,目前国内大部分院校的相关专业都有开设。从时间上看,“汇编语言程序设计”一般开设在大学二年级,从课程的衔接上看,则一般开设在“高级语言程序设计”和“计算机组成原理”之后。

汇编语言也好,高级语言也好,它们都只不过是程序设计的工具,因此对于程序的基本功能和程序设计的基本问题,它们都有相应的实现机制,而且在很多方面都是相通的,尤其是在程序设计的基本思想方法上。但汇编语言和高级语言毕竟是两种不同的语言类别。从源程序的基本单位――语句的层面看,高级语言语句的功能远比汇编语言语句即各种指令和伪指令的功能要强大。此外即便是同样的问题,如数据安排、数据处理、流程控制、子程序结构等,它们的实现机制也不一样。

效率最高的教学方法首推比较教学法(或叫类比教学法),也就是将新的陌生的东西和旧的熟悉的东西做比较,找出它们之间相同的地方和不同的地方,然后进行差异化的学习,重在存同求异,这样就会事半功倍。

因此,笔者在多年从事“汇编语言程序设计”的教学中,特别注重以学生在学习高级语言程序设计课程时所获得的知识和体验为基础,将汇编语言和高级语言进行比较教学。

本文就是这一教学方法的经验总结。

1数据的组织安排

程序是用来加工处理数据的,因此程序设计工作离不开数据的组织安排。数据的组织安排就是指为程序加工处理的数据安排合适的空间并且组织好,以提高对数据加工处理的效率。从应用层面看,数据的组织安排通常包括3个方面:

(1)安排在哪?即空间位置问题。

(2)安排多大空间?即数据长度问题。

(3)存放什么样的数据?即数据类型问题。

在数据空间的组织安排方面,汇编语言和高级语言的一个重要差别是:高级语言提供的是直接面向应用的数据类型,如C语言中的基本类型――整型(int)、浮点型(float)、字符型(char),而整型又有长(long)、短(short)之分,浮点型又有单精度(single)和双精度(double)之分,此外还有有符号(signed)和无符号(unsigned)之分等。高级语言的数据类型是面向应用的,因此它们有两方面的含义:类型特点和长度大小,这就解决了上述3个问题中的后两个问题[1]。

在C语言中,数据除了有类型这个概念之外,还有类别之分,即存储类别问题,共有4种:static、auto、register和extern。从严格意义上讲,其中和数据空间的组织安排有关的只是前3种:static和auto对应的是内存空间,而register对应的则是寄存器空间,这又解决了上述3个问题中的第一个问题[1]。

与高级语言不同的是,汇编语言的数据类型是面向机器的,如MASM中的基本类型――DB、DW、DD、DQ、DT等,它们只有长度大小的含义,而且都是对应内存空间的,因此用它们定义的变量都属于内存变量。

在汇编语言中,由于可以直接引用各个寄存器,而且各个寄存器的空间大小都是确定的,因此这些寄存器实际上就相当于C语言中的寄存器变量。

总之,在汇编语言中,数据一般只有空间大小和位置之分,而不管这个空间中存放什么样的数据,即无类型之分。

因此,在用汇编语言设计程序时,对程序中的数据有一个面向应用的自我理解问题!这是在教学时应特别予以关注的!

2数据的加工处理

在数据的输入输出方面,汇编语言和高级语言也有重要差别。

以面向标准输入输出设备的数据输入输出为例,高级语言提供的也是直接面向应用的相关语句、函数和过程,如C语言中的fprintf、printf、sprintf、vprintf、vfprintf、vsprintf、fscanf、scanf、sscanf、fgetc、fputc、getc、putc、getchar、putchar、fgets、fputs、pus、gets等,这些函数基本上满足了面向应用的各种类型数据的输入输出[1]。

汇编语言提供的则基本上是面向字符的中断调用,即通过调用相关的中断服务程序来实现数据的输入输出,如MASM中的常用的DOS提供的21H类中断服务程序的1、2、8、9、10号功能等。

总之,高级语言提供的一般是直接面向应用的输入输出机制,而汇编语言提供的则一般是面向系统的输入输出机制。因此在汇编语言程序设计的教学中,如何利用面向系统的输入输出机制通过编程实现面向应用的输入输出功能是我们的又一个重点。

在数据的内部加工处理方面,高级语言和汇编语言都提供一序列的运算符。

在C语言中,这些运算符包括为数据传送提供的赋值运算符“=”和为数据运算提供的算术运算符“+、-、*、/、%、++、--”、关系运算符“>、>=、

在MASM中,这些运算符包括算术运算符:“+、-、*、/、MOD”,逻辑运算符:“AND、OR、NOT、XOR”,关系运算符:“EQ、NE、LT、GT、LE、GE”,移位运算符:SHR和SHL等[2]。

值得注意的是,除了形式上的差别外,高级语言的运算符和汇编语言的运算符在功能上也是有差别的:高级语言的运算符往往可以用在包括常量和变量的各种数据之间,而汇编语言的运算符则往往只能用在常量之间,对变量的加工处理则是依靠相应的指令来实现的。

3流程控制问题

为了实现流程控制,高级语言都提供有两类基本语句:分支控制语句和循环控制语句,如C语言和PASCAL语言中的if语句、switch语句、for语句、while语句、do-while语句、case语句、repeat语句以及比较特别的goto语句等[1,3]。

汇编语言则提供有相应的流程控制类指令,如MASM中的无条件转移指令(JMP)、条件转移指令(JA、JB、JAE、JBE、JNZ、JZ、JG、JL、JGE、JLE、JO、JNO、JS、JNS、JC、JNC等)、循环控制指令(LOOP、LOOPZ、LOOPNZ)等[2,4-6]。

在功能上,汇编语言的转移类指令既可以用于分支控制,也可以用于循环控制,而循环类指令则自然主要用于循环控制。它们的实现机制在高级语言中也有体现,如C语言中的goto语句。

从功能上看,C语言中的goto语句主要有两种用法:

(1)goto标号;

(2)if条件goto标号。

前一种用法实现的正好是汇编语言中无条件转移指令的功能,而后一种用法实现的则正好是汇编语言中条件转移指令和循环控制指令的功能。

在用汇编语言写分支控制程序时尤其要注意的是,由于只能一个分支一个分支的纵向展开,因此除最后书写的分支外,前面的分支结尾处一般都应该有一条无条件转移指令以跳过后面的分支,避免执行不该执行的分支。

例如:输入一个字符,判断其是否为数字‘9’,若是,则输出字符‘Y’;否则,输出字符‘N’。这是一个简单的二分支问题,其汇编语言程序段如下:

MOV AH,1

INT 21H

CMP AL,‘9’

JZ YES ;开始分支

MOV DL,‘N’ ;第一个分支

JMP EXIT ;避免执行第二个分支

YES:MOV DL,‘Y’ ;第二个分支

EXIT:MOV AH,2 ;汇合点

INT 21H

汇编语言除了提供上述转移控制类指令和循环控制类指令以实现分支程序设计和循环程序设计外,还提供有子程序和中断服务程序的调用(CALL、INT)指令和返回(RET、IRET)指令以及比较特别的重复前缀指令(REP、REPZ、REPNZ)等。

汇编语言的子程序概念和高级语言中的子程序概念、函数概念以及过程概念是对应的,而中断服务程序概念则一般是汇编语言独有的。

如果仅从程序执行机制上看,子程序、函数、过程、中断服务程序的地位是一样的,只不过是在不同的语言环境中采用了不同的称呼而已。

主程序和子程序、函数、过程、中断服务程序之间的流程控制都是通过调用与返回实现的,差别是:在高级语言中,主程序和子程序、函数、过程之间的流程控制是通过直接引用子程序、函数或过程的名字(加上适当的参数)来实现的[1,3];而在汇编语言中,主程序和子程序、中断服务程序之间的流程控制是通过前面提到的专门的控制指令(CALL、RET、INT、IRET)来实现的。

4子程序问题

前已述及,汇编语言的子程序结构相当于高级语言中的子程序、函数和过程。

在采用子程序结构时,一个重要的问题就是参数传递。主程序在通过调用子程序为自己解决某些问题时,通常需要为子程序提供一些相关的数据,子程序在内部对这些数据做相应的加工处理后应该将处理结果返回给主程序,这就是所谓的参数传递问题。主程序提供给子程序的数据通常叫做入口参数,而子程序返回给主程序的数据则通常叫做出口参数。

汇编语言子程序的参数传递和高级语言中子程序、函数或过程的参数传递机制从本质上看是一致的。

需要做参数传递时,通常有两种选择:一种方法是直接传递所需要的数据,另一种方法是传递所需数据的位置信息即内存地址。第一种方法即通常所说的值传递,第二种方法即通常所说的地址传递。需要注意的是,传地址的目的也是为了传数据。

从表象即实现形式上看,汇编语言子程序的参数传递和高级语言子程序的参数传递却有着不小的差别。

在高级语言中,函数在定义时往往就有参数说明,如C语言的函数定义格式如下:

类型 函数名(形式参数表)

{

函数体

}

高级语言的函数在调用时需要同时提供参数,一般格式是:函数名(实际参数表)。而在汇编语言中,子程序在定义时不需要有关参数的说明,在调用时自然也就无需同时提供参数。

如在MASM中,子程序的定义格式为:

子程序名 PROC

子程序体

子程序名 ENDP

子程序的调用格式则为:CALL子程序名

由此可见,高级语言中函数的参数传递是显式进行的,较之汇编语言子程序中隐式进行的的参数传递问题要易于实现和理解接受一些。因此,汇编语言中的子程序的参数传递问题就是教学中的一个重点内容。

在汇编语言中,为了实现子程序的参数传递,不管是采用值传递还是采用地址传递,都需要由程序设计者事先安排好一个第三方空间。值传递时将所需要的数据本身放在这个事先安排好的空间中,而地址传递时则将存放所需要的数据位置信息即内存地址放在这个事先安排好的空间里。

在安排用于参数传递的第三方空间时,既可以安排寄存器,也可以安排内存单元,还可以安排堆栈。因此具体的参数传递方式灵活多样,而且各有各的优势,在实际应用中通常综合以上各种做法以求达到最佳效果[2,4-6]。

5结语

限于篇幅,以上仅就程序设计的几个主要方面作了比较论述,而且主要是从实现机制的角度来谈,因此细节的东西基本上都省却了。事实上,在其他方面,汇编语言和高级语言也具有一定的可比性。

实践证明,通过比较教学,一方面可以利用学生已有的知识和体验帮助他们更好地学习汇编语言的相关知识,即把他们在高级语言程序设计中获得的有关程序设计的基本思想方法和规律迁移到汇编语言程序设计的学习中来,进行差异化的学习,极大地提高学习效率;另一方面,可以让同学们通过比较,把以前在学习高级语言程序设计时遗留的一些问题甚至没有意识到的问题搞清楚,起到融会贯通、触类旁通的作用。

总之,通过比较教学,不仅可以提高学生的学习效果和效率,而且新旧知识可以相得益彰。

参考文献:

[1] 谭浩强. C程序设计[M]. 3版. 北京:清华大学出版社,2005.

[2] 曹加恒,苏光奎,许先斌,等. 新一代汇编语言程序设计[M]. 北京:高等教育出版社,2003.

[3] 郑启华. PASCAL程序设计[M]. 2版. 北京:清华大学出版社,1996.

[4] (美)欧文. Intel汇编语言程序设计[M]. 5版. 温玉杰,梅广宇,罗云彬,译. 北京:电子工业出版社,2007.

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

[6] 钱晓捷. 新版汇编语言程序设计[M]. 北京:电子工业出版社,2006.

The Comparative Teaching Method of “Assemly Language”

XIONG Xiao-bing

(Computer School, Wuhan University, Wuhan 430079, China)

Abstract: Based on the advantages of comparative teaching, this paper makes some analyses on asembly languages in contrast to advaned languages from the basic aspects of programming, including data arrangment, data processing, flow control and sub-program.

Key words: programming assembly language; advanced language; comparative teaching

上一篇:探索高级语言程序设计教学中培养学生创新能力... 下一篇:中央广播电视大学与中国软件行业协会合作机制...