吳元斌



摘要:該文分析了基于編程的計算機組成原理實驗教學方法,介紹了字節順序和數據對齊、存儲器層次結構與局部性原理、整數的機器表示與運算、浮點數的表示與運算、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.
【通聯編輯:王力】