基于编程的计算机组成原理实验教学

2020-02-22 03:58吴元斌
电脑知识与技术 2020年36期
关键词:计算机组成原理C语言编程

吴元斌

摘要:该文分析了基于编程的计算机组成原理实验教学方法,介绍了字节顺序和数据对齐、存储器层次结构与局部性原理、整数的机器表示与运算、浮点数的表示与运算、DEBUG与机器指令、C语言程序的机器级表示等实验教学内容。实践表明,基于编程的实验教学对学生学习和掌握计算机组成原理十分有效。

关键词:计算机组成原理;实验;教学;编程;C语言

中图分类号:G642        文献标识码:A

文章编号:1009-3044(2020)36-0110-03

Abstract:the experimental teaching method of computer composition principle based on programming are analyzed in this paper. the byte ordering and data alignment, the memory hierarchy and the principle of locality, the machine representation and operation of integers, the representation and operation of floating-point numbers, debug and machine instructions, and machine level representation of C language programs are introduced. Practice shows that the experimental teaching method based on programming is very effective for students to learn and master the principles of computer organization.

Key words:the principles of computer organization; experiment; teaching; programming; the c language

1 引言

計算机组成原理课程的主要目标是:(1)理解单处理器计算机系统中各部件的内部工作原理、组成结构以及相互连接方式,具有完整的计算机系统的整机概念。(2)理解计算机系统层次化结构概念,熟悉硬件与软件之间的界面,掌握指令集体系结构的基本知识和基本实现方法。(3)能够综合运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论和实际问题进行计算、分析,对一些基本部件进行简单设计;并能对高级程序设计语言(如C语言)中的相关问题进行分析[1]。该课程实验教学是课程不可缺少的组成部分和重要环节,通过理论联系实际,可以加深理解和掌握计算机的组成原理,为计算机组成原理的具体应用打下基础,实验课与理论课相互作用才能实现课程的总体目标。

5年多以前,我们采用一些专门的实验教学系统(实验箱)进行计算机组成原理实验,如:EL-JY-Ⅱ计算机组成原理实验系统。利用实验教学系统开设了运算器、移位运算、存储器读写和总线控制、总线控制、微程序控制器原理、微程序设计、简单模型机组成原理等实验,对计算机组成原理的理论教学具有一定的帮助,但也存在不少问题,主要有:

(1) 通过插拔连线、拨动开关、编制微程序等操作步骤与实验系统进行交互完成验证性实验,学生普遍对操作过程有兴趣,但不少学生只关注操作过程,不注意学习背后的原理,不能很好地起到巩固理论教学内容的作用。

(2) 对于简单的实验,学生基本上能够顺利完成,但比较复杂的实验(如:简单模型机组成原理实验)却很少成功,打击了不少学生的学习积极性。没有Cache、浮点数的表示与运算等实验内容。

(3) 实验箱数量相对较少,学生人数较多,只能分成多个小组进行实验教学,而且实验箱有时会因故障得不到及时维修,给实验教学带来很大影响。

(4) 实验箱教学系统与学生应用开发的环境差距很大,学生很难感受到计算机组成原理课程对实际计算机应用开发的作用。

为了解决传统实验教学存在的问题,为了适应新时代的教学需要,激发学生的学习兴趣,从2015年起开始我们对计算机组成原理的实验内容和实验方式进行了改革,紧扣经典教材[2],结合我们的实际情况,进行了基于编程的实验教学探索,基本思想是通过程序员的视角[3,4,5]来学习、理解、掌握计算机组成原理,在这几年的实践中对实验教学内容进行了不断修改、补充和完善。实践表明,基于编程的实验教学具有较好的教学效果,受到学生的肯定。下文将简要介绍基于编程的实验教学改革的最新内容。

2 基于编程的实验教学内容

2.1 字节顺序和数据对齐

数据在内存中的字节顺序一般包括两种:大端方式和小端方式[2,3]。大端方式是指数据的高字节存放在低地址,低字节存放高地址,也就是数据在内存中从高位字节开始存放。而小端方式则相反,数据的低字节存放在低地址,高字节存放在高地址,也就是数据在内存中从低位字节开始存放。数据的大端、小端方式存放顺序如图1中左图所示。内存中数据存放方式的验证可以通过调用图1中右图的C语言函数[3,6]来实现,将输出从地址start开始的len个字节的地址及该地址存放字节的十六进制值。

数据对齐是指系统要求数据在内存中的起始地址值(边界)能被该数据所占字节数整除,如C语言中的short类型数据占2字节,要求其起始地址能被2整除,int类型数据占4字节,要求其起始地址能被4整除,等等。正是由于这个原因,当C语言结构类型数据中包含不同类型数据成员时,相邻成员之间地址不一定是连续的,可能存在“空隙”。数据边界对齐的验证可以通过调用图1中右图的C语言函数来实现。

该实验通过编写、运行、调试C语言程序,帮助学生理解各种数据类型的数据在内存中的字节顺序(大端还是小端),理解各种数据类型的数据在内存中的边界对齐方式,并掌握结构数据内各成员在内存中地址之间的关系以及结构数据大小的正确计算方法(相邻成员之间地址不一定是连续的),从而加深对理论教材相关内容的理解,同时也可以对C语言相关内容的温习与深化。

2.2 存储器层次结构与局部性原理

现代计算机存储器采用金字塔层次结构。高速缓存(Cache)至关重要,可以利用Windows 10任务管理器的性能选项卡(或CPU-Z软件)查看系统的缓存结构,如图2所示,如:L1缓存、L2缓存、L3缓存容量及特性,如:一级数据缓存(大小:32KBytes×2,8-way set associative,64-byte line size)等。实验要求学生理解这些参数的含义,并分析L1缓存分为L1指令缓存和L1数据缓存的原因。这些问题在理论教材[2,3,8]中都有详细介绍(特别是Cache的工作原理)或说明。

通过实际编程理解程序访问的局部性(时间和空间局部性)原理对系统性能的影响是本实验的主要任务,通过大小可变的二维数组的不同访问顺序(按行、按列)的C语言程序段[2]与Java程序段的执行时间来分析Cache的影响和作用。图3中左边是C语言程序段,右边是Java程序段。二维数组按行访问较按列访问具有良好的空间局部性,Cache命中率更高,按行访问性能更高,C程序与Java程序运行得出的结论相同。

2.3 整数的机器表示与运算

理论课介绍了机器数的定点整数表示及其算术运算(如移位、加、减、乘、除等),C语言中整数类型(char、short、int、long)在计算机内是定点整数表示,带符号数采用补码表示,无符号(unsigned)整数则没有符号位。这部分实验要求学生掌握C语言整数类型在计算机内的表示方法与算术运算方法,还应注意无符号数整数类型和带符号整数类型之间运算的特殊性,以及机器整数运算与数学中整数运算的差别,如C语言表达式200 * 300 * 400 * 500的值会溢出,若作为数学表达式则没有溢出的概念。

为了使C语言整数的表示与运算结果以二进制形式输出,我们设计了如圖4所示的两个C语言函数show_bits和show_bytes,它们的功能分别是将一个显示一个字节的二进制代码(每4位二进制加一个空格,以便阅读)、从高位字节到低位字节调用show_bits显示整数对象(也可以是其他类型的对象)的二进制表示。

2.4 浮点数的机器表示与运算

理论课还介绍了机器数的浮点表示及其算术运算,在现代计算机中,浮点数的表示则是采用IEEE 754标准,它是20世纪80年代以来最广泛使用的浮点数运算标准,便于计算机之间进行数据交换与协同工作。标准规定了4种表示浮点数值的方式,常用的是单精确度(32位)、双精确度(64位)。

C语言的float、double类型通常分别指IEEE单精确度、双精确度浮点数,本实验主要是掌握float、double浮点数在机器中的二进制表示方法、运算方法和运算过程。为了使C语言浮点数的表示及运算结果以二进制形式输出依然调用图4中的两个C语言函数来实现。同时应理解IEEE 754 浮点数一些特殊值的表示,如:零、非零、1、-1、正无穷、负无穷的表示等。还要注意理解浮点数与整数运算、数学运算的区别,如C语言表达式3.14 + 1e20 > 1e20的值等于0(为假),但在数学上该表达式的值一定为真。

2.5 DEBUG与机器指令

为了使学生深入理解理论教材[2]第7章“指令系统”以及第8章“CPU的结构和功能”中“CPU的寄存器”部分的内容,我们采用DEBUG(DOS、Windows实模式下的调试工具)命令使学生快速学习、理解现代计算机中CPU寄存器、机器指令、寻址方式、堆栈操作、子程序调用、中断调用、I/O端口操作等基本概念,理解机器语言与汇编语言的对应关系。

图5左图是利用DEBUG学习机器指令的寻址方式,输入、保存、调试程序的过程,右图为教材表7.2求N个数平均值程序的具体实现。通过快速的学习和使用DEDUG程序,学生普遍反映学会了利用DEBUG编写、运行汇编程序,还获得意外收获:“…还可以手工检查计算机病毒,学习到了新的技能!”。

2.6 C语言程序的机器级表示

理论教材[2]第1章中给出了求一元二次多项式a * x * x + b * x + c的机器语言程序(表1.2),为了理解x86指令集体系结构如何实现对应功能以及C语言程序与实际机器语言的对应关系,图6中给出实现该功能的两个C语言函数intSum和floatSum,并在Eclipse + MinGW GCC调试环境中利用Windows → Show View → Disassembly,打开反汇编视图给出对应的反汇编代码(为了便于分析,图6对实际截图进行重排:上面是C语言函数,下面是对应的汇编语言程序)。

通过图6可以看出,两个函数中C语言表达式并没有优化为((a + 0)*x + b)*x + c,但在对应的汇编语言程序中对表达式的求值进行了优化处理,而且由于两个函数中变量的数据类型不同(int、float),对应的机器指令也不同,如mov、flds、imul、fmuls等。要真正理解这两段汇编语言程序要结合上一个实验,并参考文献资料进行对照分析。

3 结论

上述基于编程的实验教学改革,紧扣教材和教学总体目标,对理论教学内容进行了具体化和深化,使学生能够在高级语言程序(如C语言)、汇编语言程序、机器指令代码和机器结构之间建立相互的对应关系,使一些抽象的概念变成看得见的具体数据。最近几学期(从前往后)学生学期平均成绩、及格率依次为:63.545、72.235%;65.915、77.405%;76.37、98.39%;71.5、83.83%。最后一组数据是本学期的情况,由于受到疫情影响,理论课在线上完成,实验课则在线下分组完成。可以看出,教学质量总体上在逐步提高,这种教学改革实践也受到学生的肯定:“课堂内容充实,简单明了,使学生能够轻轻松松掌握知识”。

我们的实验教学改革还在不断探索过程中,还存在不少问题,如如何更好地让学生自己动手编写、调试、运行程序,充分体会到计算机组成原理课程的重要意义及对从事计算机应用开发的重要作用等。我们将不断总结经验,学习国内外该课程实验教学改革最新成果,进一步提高课程的教学质量。

参考文献:

[1] 教育部考试中心. 2020年全国硕士研究生招生考试计算机科学与技术学科联考计算机学科专业基础综合考试大纲[M].北京:高等教育业出版社,2019.

[2] 唐朔飞.计算机组成原理[M].2版.北京:高等教育业出版社,2008.

[3] (美)Randal E.Bryant, David R.OHalloran. 深入理解计算机系统[M].2版.龚奕利, 雷迎春, 译. 北京:机械工业出版社,2010.

[4] 袁春风,张泽生,蔡晓燕,杨若瑜,王帅.计算机组成原理课程实践教学探索[J]. 计算机教育,2011(17):110-114.

[5] 袁春风.计算机系统基础[M].北京:机械工业出版社,2014.

[6](美)Brian W.Kernighan, Dennis M.Ritchie. C程序设计语言[M]. 2版.徐宝文,李志, 译. 北京:机械工业出版社,2004.

[7] 王帅,袁春风.美国一流大学计算机组成与系统结构实验课程研究[J].计算机教育,2011(17):115-118.

[8](美)William Stallings. 计算机组成与体系结构:性能设计[M].10版.北京:机械工业出版社,2019.

【通联编辑:王力】

猜你喜欢
计算机组成原理C语言编程
编程,是一种态度
编程小能手
基于Visual Studio Code的C语言程序设计实践教学探索
纺织机上诞生的编程
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索
面向计算机系统能力培养的计算机组成原理实验教学
用“工程思维”引领《计算机组成原理》课程教学
《计算机组成原理》课程建设的改革与探索
论子函数在C语言数据格式输出中的应用