吳元斌
摘要:該文分析了基于編程的計(jì)算機(jī)組成原理實(shí)驗(yàn)教學(xué)方法,介紹了字節(jié)順序和數(shù)據(jù)對齊、存儲(chǔ)器層次結(jié)構(gòu)與局部性原理、整數(shù)的機(jī)器表示與運(yùn)算、浮點(diǎn)數(shù)的表示與運(yùn)算、DEBUG與機(jī)器指令、C語言程序的機(jī)器級表示等實(shí)驗(yàn)教學(xué)內(nèi)容。實(shí)踐表明,基于編程的實(shí)驗(yàn)教學(xué)對學(xué)生學(xué)習(xí)和掌握計(jì)算機(jī)組成原理十分有效。
關(guān)鍵詞:計(jì)算機(jī)組成原理;實(shí)驗(yàn);教學(xué);編程;C語言
中圖分類號:G642? ? ? ? 文獻(xiàn)標(biāo)識碼: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 引言
計(jì)算機(jī)組成原理課程的主要目標(biāo)是:(1)理解單處理器計(jì)算機(jī)系統(tǒng)中各部件的內(nèi)部工作原理、組成結(jié)構(gòu)以及相互連接方式,具有完整的計(jì)算機(jī)系統(tǒng)的整機(jī)概念。(2)理解計(jì)算機(jī)系統(tǒng)層次化結(jié)構(gòu)概念,熟悉硬件與軟件之間的界面,掌握指令集體系結(jié)構(gòu)的基本知識和基本實(shí)現(xiàn)方法。(3)能夠綜合運(yùn)用計(jì)算機(jī)組成的基本原理和基本方法,對有關(guān)計(jì)算機(jī)硬件系統(tǒng)中的理論和實(shí)際問題進(jìn)行計(jì)算、分析,對一些基本部件進(jìn)行簡單設(shè)計(jì);并能對高級程序設(shè)計(jì)語言(如C語言)中的相關(guān)問題進(jìn)行分析[1]。該課程實(shí)驗(yàn)教學(xué)是課程不可缺少的組成部分和重要環(huán)節(jié),通過理論聯(lián)系實(shí)際,可以加深理解和掌握計(jì)算機(jī)的組成原理,為計(jì)算機(jī)組成原理的具體應(yīng)用打下基礎(chǔ),實(shí)驗(yàn)課與理論課相互作用才能實(shí)現(xiàn)課程的總體目標(biāo)。
5年多以前,我們采用一些專門的實(shí)驗(yàn)教學(xué)系統(tǒng)(實(shí)驗(yàn)箱)進(jìn)行計(jì)算機(jī)組成原理實(shí)驗(yàn),如:EL-JY-Ⅱ計(jì)算機(jī)組成原理實(shí)驗(yàn)系統(tǒng)。利用實(shí)驗(yàn)教學(xué)系統(tǒng)開設(shè)了運(yùn)算器、移位運(yùn)算、存儲(chǔ)器讀寫和總線控制、總線控制、微程序控制器原理、微程序設(shè)計(jì)、簡單模型機(jī)組成原理等實(shí)驗(yàn),對計(jì)算機(jī)組成原理的理論教學(xué)具有一定的幫助,但也存在不少問題,主要有:
(1) 通過插拔連線、撥動(dòng)開關(guān)、編制微程序等操作步驟與實(shí)驗(yàn)系統(tǒng)進(jìn)行交互完成驗(yàn)證性實(shí)驗(yàn),學(xué)生普遍對操作過程有興趣,但不少學(xué)生只關(guān)注操作過程,不注意學(xué)習(xí)背后的原理,不能很好地起到鞏固理論教學(xué)內(nèi)容的作用。
(2) 對于簡單的實(shí)驗(yàn),學(xué)生基本上能夠順利完成,但比較復(fù)雜的實(shí)驗(yàn)(如:簡單模型機(jī)組成原理實(shí)驗(yàn))卻很少成功,打擊了不少學(xué)生的學(xué)習(xí)積極性。沒有Cache、浮點(diǎn)數(shù)的表示與運(yùn)算等實(shí)驗(yàn)內(nèi)容。
(3) 實(shí)驗(yàn)箱數(shù)量相對較少,學(xué)生人數(shù)較多,只能分成多個(gè)小組進(jìn)行實(shí)驗(yàn)教學(xué),而且實(shí)驗(yàn)箱有時(shí)會(huì)因故障得不到及時(shí)維修,給實(shí)驗(yàn)教學(xué)帶來很大影響。
(4) 實(shí)驗(yàn)箱教學(xué)系統(tǒng)與學(xué)生應(yīng)用開發(fā)的環(huán)境差距很大,學(xué)生很難感受到計(jì)算機(jī)組成原理課程對實(shí)際計(jì)算機(jī)應(yīng)用開發(fā)的作用。
為了解決傳統(tǒng)實(shí)驗(yàn)教學(xué)存在的問題,為了適應(yīng)新時(shí)代的教學(xué)需要,激發(fā)學(xué)生的學(xué)習(xí)興趣,從2015年起開始我們對計(jì)算機(jī)組成原理的實(shí)驗(yàn)內(nèi)容和實(shí)驗(yàn)方式進(jìn)行了改革,緊扣經(jīng)典教材[2],結(jié)合我們的實(shí)際情況,進(jìn)行了基于編程的實(shí)驗(yàn)教學(xué)探索,基本思想是通過程序員的視角[3,4,5]來學(xué)習(xí)、理解、掌握計(jì)算機(jī)組成原理,在這幾年的實(shí)踐中對實(shí)驗(yàn)教學(xué)內(nèi)容進(jìn)行了不斷修改、補(bǔ)充和完善。實(shí)踐表明,基于編程的實(shí)驗(yàn)教學(xué)具有較好的教學(xué)效果,受到學(xué)生的肯定。下文將簡要介紹基于編程的實(shí)驗(yàn)教學(xué)改革的最新內(nèi)容。
2 基于編程的實(shí)驗(yàn)教學(xué)內(nèi)容
2.1 字節(jié)順序和數(shù)據(jù)對齊
數(shù)據(jù)在內(nèi)存中的字節(jié)順序一般包括兩種:大端方式和小端方式[2,3]。大端方式是指數(shù)據(jù)的高字節(jié)存放在低地址,低字節(jié)存放高地址,也就是數(shù)據(jù)在內(nèi)存中從高位字節(jié)開始存放。而小端方式則相反,數(shù)據(jù)的低字節(jié)存放在低地址,高字節(jié)存放在高地址,也就是數(shù)據(jù)在內(nèi)存中從低位字節(jié)開始存放。數(shù)據(jù)的大端、小端方式存放順序如圖1中左圖所示。內(nèi)存中數(shù)據(jù)存放方式的驗(yàn)證可以通過調(diào)用圖1中右圖的C語言函數(shù)[3,6]來實(shí)現(xiàn),將輸出從地址start開始的len個(gè)字節(jié)的地址及該地址存放字節(jié)的十六進(jìn)制值。
數(shù)據(jù)對齊是指系統(tǒng)要求數(shù)據(jù)在內(nèi)存中的起始地址值(邊界)能被該數(shù)據(jù)所占字節(jié)數(shù)整除,如C語言中的short類型數(shù)據(jù)占2字節(jié),要求其起始地址能被2整除,int類型數(shù)據(jù)占4字節(jié),要求其起始地址能被4整除,等等。正是由于這個(gè)原因,當(dāng)C語言結(jié)構(gòu)類型數(shù)據(jù)中包含不同類型數(shù)據(jù)成員時(shí),相鄰成員之間地址不一定是連續(xù)的,可能存在“空隙”。數(shù)據(jù)邊界對齊的驗(yàn)證可以通過調(diào)用圖1中右圖的C語言函數(shù)來實(shí)現(xiàn)。
該實(shí)驗(yàn)通過編寫、運(yùn)行、調(diào)試C語言程序,幫助學(xué)生理解各種數(shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的字節(jié)順序(大端還是小端),理解各種數(shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中的邊界對齊方式,并掌握結(jié)構(gòu)數(shù)據(jù)內(nèi)各成員在內(nèi)存中地址之間的關(guān)系以及結(jié)構(gòu)數(shù)據(jù)大小的正確計(jì)算方法(相鄰成員之間地址不一定是連續(xù)的),從而加深對理論教材相關(guān)內(nèi)容的理解,同時(shí)也可以對C語言相關(guān)內(nèi)容的溫習(xí)與深化。
2.2 存儲(chǔ)器層次結(jié)構(gòu)與局部性原理
現(xiàn)代計(jì)算機(jī)存儲(chǔ)器采用金字塔層次結(jié)構(gòu)。高速緩存(Cache)至關(guān)重要,可以利用Windows 10任務(wù)管理器的性能選項(xiàng)卡(或CPU-Z軟件)查看系統(tǒng)的緩存結(jié)構(gòu),如圖2所示,如:L1緩存、L2緩存、L3緩存容量及特性,如:一級數(shù)據(jù)緩存(大小:32KBytes×2,8-way set associative,64-byte line size)等。實(shí)驗(yàn)要求學(xué)生理解這些參數(shù)的含義,并分析L1緩存分為L1指令緩存和L1數(shù)據(jù)緩存的原因。這些問題在理論教材[2,3,8]中都有詳細(xì)介紹(特別是Cache的工作原理)或說明。
通過實(shí)際編程理解程序訪問的局部性(時(shí)間和空間局部性)原理對系統(tǒng)性能的影響是本實(shí)驗(yàn)的主要任務(wù),通過大小可變的二維數(shù)組的不同訪問順序(按行、按列)的C語言程序段[2]與Java程序段的執(zhí)行時(shí)間來分析Cache的影響和作用。圖3中左邊是C語言程序段,右邊是Java程序段。二維數(shù)組按行訪問較按列訪問具有良好的空間局部性,Cache命中率更高,按行訪問性能更高,C程序與Java程序運(yùn)行得出的結(jié)論相同。
2.3 整數(shù)的機(jī)器表示與運(yùn)算
理論課介紹了機(jī)器數(shù)的定點(diǎn)整數(shù)表示及其算術(shù)運(yùn)算(如移位、加、減、乘、除等),C語言中整數(shù)類型(char、short、int、long)在計(jì)算機(jī)內(nèi)是定點(diǎn)整數(shù)表示,帶符號數(shù)采用補(bǔ)碼表示,無符號(unsigned)整數(shù)則沒有符號位。這部分實(shí)驗(yàn)要求學(xué)生掌握C語言整數(shù)類型在計(jì)算機(jī)內(nèi)的表示方法與算術(shù)運(yùn)算方法,還應(yīng)注意無符號數(shù)整數(shù)類型和帶符號整數(shù)類型之間運(yùn)算的特殊性,以及機(jī)器整數(shù)運(yùn)算與數(shù)學(xué)中整數(shù)運(yùn)算的差別,如C語言表達(dá)式200 * 300 * 400 * 500的值會(huì)溢出,若作為數(shù)學(xué)表達(dá)式則沒有溢出的概念。
為了使C語言整數(shù)的表示與運(yùn)算結(jié)果以二進(jìn)制形式輸出,我們設(shè)計(jì)了如圖4所示的兩個(gè)C語言函數(shù)show_bits和show_bytes,它們的功能分別是將一個(gè)顯示一個(gè)字節(jié)的二進(jìn)制代碼(每4位二進(jìn)制加一個(gè)空格,以便閱讀)、從高位字節(jié)到低位字節(jié)調(diào)用show_bits顯示整數(shù)對象(也可以是其他類型的對象)的二進(jìn)制表示。
2.4 浮點(diǎn)數(shù)的機(jī)器表示與運(yùn)算
理論課還介紹了機(jī)器數(shù)的浮點(diǎn)表示及其算術(shù)運(yùn)算,在現(xiàn)代計(jì)算機(jī)中,浮點(diǎn)數(shù)的表示則是采用IEEE 754標(biāo)準(zhǔn),它是20世紀(jì)80年代以來最廣泛使用的浮點(diǎn)數(shù)運(yùn)算標(biāo)準(zhǔn),便于計(jì)算機(jī)之間進(jìn)行數(shù)據(jù)交換與協(xié)同工作。標(biāo)準(zhǔn)規(guī)定了4種表示浮點(diǎn)數(shù)值的方式,常用的是單精確度(32位)、雙精確度(64位)。
C語言的float、double類型通常分別指IEEE單精確度、雙精確度浮點(diǎn)數(shù),本實(shí)驗(yàn)主要是掌握float、double浮點(diǎn)數(shù)在機(jī)器中的二進(jìn)制表示方法、運(yùn)算方法和運(yùn)算過程。為了使C語言浮點(diǎn)數(shù)的表示及運(yùn)算結(jié)果以二進(jìn)制形式輸出依然調(diào)用圖4中的兩個(gè)C語言函數(shù)來實(shí)現(xiàn)。同時(shí)應(yīng)理解IEEE 754 浮點(diǎn)數(shù)一些特殊值的表示,如:零、非零、1、-1、正無窮、負(fù)無窮的表示等。還要注意理解浮點(diǎn)數(shù)與整數(shù)運(yùn)算、數(shù)學(xué)運(yùn)算的區(qū)別,如C語言表達(dá)式3.14 + 1e20 > 1e20的值等于0(為假),但在數(shù)學(xué)上該表達(dá)式的值一定為真。
2.5 DEBUG與機(jī)器指令
為了使學(xué)生深入理解理論教材[2]第7章“指令系統(tǒng)”以及第8章“CPU的結(jié)構(gòu)和功能”中“CPU的寄存器”部分的內(nèi)容,我們采用DEBUG(DOS、Windows實(shí)模式下的調(diào)試工具)命令使學(xué)生快速學(xué)習(xí)、理解現(xiàn)代計(jì)算機(jī)中CPU寄存器、機(jī)器指令、尋址方式、堆棧操作、子程序調(diào)用、中斷調(diào)用、I/O端口操作等基本概念,理解機(jī)器語言與匯編語言的對應(yīng)關(guān)系。
圖5左圖是利用DEBUG學(xué)習(xí)機(jī)器指令的尋址方式,輸入、保存、調(diào)試程序的過程,右圖為教材表7.2求N個(gè)數(shù)平均值程序的具體實(shí)現(xiàn)。通過快速的學(xué)習(xí)和使用DEDUG程序,學(xué)生普遍反映學(xué)會(huì)了利用DEBUG編寫、運(yùn)行匯編程序,還獲得意外收獲:“…還可以手工檢查計(jì)算機(jī)病毒,學(xué)習(xí)到了新的技能!”。
2.6 C語言程序的機(jī)器級表示
理論教材[2]第1章中給出了求一元二次多項(xiàng)式a * x * x + b * x + c的機(jī)器語言程序(表1.2),為了理解x86指令集體系結(jié)構(gòu)如何實(shí)現(xiàn)對應(yīng)功能以及C語言程序與實(shí)際機(jī)器語言的對應(yīng)關(guān)系,圖6中給出實(shí)現(xiàn)該功能的兩個(gè)C語言函數(shù)intSum和floatSum,并在Eclipse + MinGW GCC調(diào)試環(huán)境中利用Windows → Show View → Disassembly,打開反匯編視圖給出對應(yīng)的反匯編代碼(為了便于分析,圖6對實(shí)際截圖進(jìn)行重排:上面是C語言函數(shù),下面是對應(yīng)的匯編語言程序)。
通過圖6可以看出,兩個(gè)函數(shù)中C語言表達(dá)式并沒有優(yōu)化為((a + 0)*x + b)*x + c,但在對應(yīng)的匯編語言程序中對表達(dá)式的求值進(jìn)行了優(yōu)化處理,而且由于兩個(gè)函數(shù)中變量的數(shù)據(jù)類型不同(int、float),對應(yīng)的機(jī)器指令也不同,如mov、flds、imul、fmuls等。要真正理解這兩段匯編語言程序要結(jié)合上一個(gè)實(shí)驗(yàn),并參考文獻(xiàn)資料進(jìn)行對照分析。
3 結(jié)論
上述基于編程的實(shí)驗(yàn)教學(xué)改革,緊扣教材和教學(xué)總體目標(biāo),對理論教學(xué)內(nèi)容進(jìn)行了具體化和深化,使學(xué)生能夠在高級語言程序(如C語言)、匯編語言程序、機(jī)器指令代碼和機(jī)器結(jié)構(gòu)之間建立相互的對應(yīng)關(guān)系,使一些抽象的概念變成看得見的具體數(shù)據(jù)。最近幾學(xué)期(從前往后)學(xué)生學(xué)期平均成績、及格率依次為:63.545、72.235%;65.915、77.405%;76.37、98.39%;71.5、83.83%。最后一組數(shù)據(jù)是本學(xué)期的情況,由于受到疫情影響,理論課在線上完成,實(shí)驗(yàn)課則在線下分組完成??梢钥闯觯虒W(xué)質(zhì)量總體上在逐步提高,這種教學(xué)改革實(shí)踐也受到學(xué)生的肯定:“課堂內(nèi)容充實(shí),簡單明了,使學(xué)生能夠輕輕松松掌握知識”。
我們的實(shí)驗(yàn)教學(xué)改革還在不斷探索過程中,還存在不少問題,如如何更好地讓學(xué)生自己動(dòng)手編寫、調(diào)試、運(yùn)行程序,充分體會(huì)到計(jì)算機(jī)組成原理課程的重要意義及對從事計(jì)算機(jī)應(yīng)用開發(fā)的重要作用等。我們將不斷總結(jié)經(jīng)驗(yàn),學(xué)習(xí)國內(nèi)外該課程實(shí)驗(yàn)教學(xué)改革最新成果,進(jìn)一步提高課程的教學(xué)質(zhì)量。
參考文獻(xiàn):
[1] 教育部考試中心. 2020年全國碩士研究生招生考試計(jì)算機(jī)科學(xué)與技術(shù)學(xué)科聯(lián)考計(jì)算機(jī)學(xué)科專業(yè)基礎(chǔ)綜合考試大綱[M].北京:高等教育業(yè)出版社,2019.
[2] 唐朔飛.計(jì)算機(jī)組成原理[M].2版.北京:高等教育業(yè)出版社,2008.
[3] (美)Randal E.Bryant, David R.OHalloran. 深入理解計(jì)算機(jī)系統(tǒng)[M].2版.龔奕利, 雷迎春, 譯. 北京:機(jī)械工業(yè)出版社,2010.
[4] 袁春風(fēng),張澤生,蔡曉燕,楊若瑜,王帥.計(jì)算機(jī)組成原理課程實(shí)踐教學(xué)探索[J]. 計(jì)算機(jī)教育,2011(17):110-114.
[5] 袁春風(fēng).計(jì)算機(jī)系統(tǒng)基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2014.
[6](美)Brian W.Kernighan, Dennis M.Ritchie. C程序設(shè)計(jì)語言[M]. 2版.徐寶文,李志, 譯. 北京:機(jī)械工業(yè)出版社,2004.
[7] 王帥,袁春風(fēng).美國一流大學(xué)計(jì)算機(jī)組成與系統(tǒng)結(jié)構(gòu)實(shí)驗(yàn)課程研究[J].計(jì)算機(jī)教育,2011(17):115-118.
[8](美)William Stallings. 計(jì)算機(jī)組成與體系結(jié)構(gòu):性能設(shè)計(jì)[M].10版.北京:機(jī)械工業(yè)出版社,2019.
【通聯(lián)編輯:王力】