陳松
【摘 要】通過對匯編語言的學(xué)習(xí),計算機(jī)專業(yè)的學(xué)生可以更好地理解計算機(jī)的工作原理,提高程序設(shè)計的能力。然而目前計算機(jī)實際應(yīng)用編程中,更多采用計算機(jī)高級語言,匯編語言應(yīng)用較少,學(xué)生入門也比較困難,本文根據(jù)長期教學(xué)實踐,對該門課程的教學(xué)工作進(jìn)行了一些有益的反思與探索。
【關(guān)鍵詞】匯編語言;教學(xué)研究;實驗設(shè)計
中圖分類號:G434 文獻(xiàn)標(biāo)識碼: A 文章編號: 2095-2457(2018)17-0068-002
DOI:10.19694/j.cnki.issn2095-2457.2018.17.033
【Abstract】Through the assembly language learning, computer professional students can better understand the working principle of the computer, improve the ability to program design. However, the practical application of computer programming, using more advanced computer language, assembly language is used less, student entry is difficult, according to the long-term teaching practice, has made some useful exploration and Reflection on the teaching of this course work.
【Key words】Assembly language; Teaching research; Experimental design
0 引言
早期的計算機(jī)專業(yè)教學(xué)中,匯編語言曾經(jīng)占據(jù)著很重要的地位,一直被認(rèn)為是理解計算機(jī)工作原理必不可少的一門工具性語言,在實際應(yīng)用中也曾經(jīng)非常流行。然而今非昔比,相對于后來誕生的一系列計算機(jī)高級語言而言,匯編語言的缺點(diǎn)也非常明顯,語法細(xì)節(jié)較多,難以記憶,程序可讀性差,不易調(diào)試與維護(hù),可移植性差,開發(fā)時間長且效率低,在實際編程中的應(yīng)用越來越少,更側(cè)重于計算機(jī)底層硬件的交互,是編寫操作系統(tǒng)核心的工具語言。
然而作為一門面向計算機(jī)硬件的語言,匯編語言有其不可替代的作用,仍然應(yīng)該作為計算機(jī)專業(yè)學(xué)生必修的課程之一。
1 教學(xué)指導(dǎo)思想及教學(xué)內(nèi)容調(diào)整
對于學(xué)生而言,使用匯編語言來編程解決純軟件的問題,往往效率不高,特別是輸入輸出環(huán)節(jié)較為繁瑣。對于計算機(jī)初學(xué)者而言,匯編語言的實際應(yīng)用也偏少,很多時候軟件編程是通過C、C++、VB、JAVA等高級語言來實現(xiàn)的。目前在計算機(jī)專業(yè)的本科教學(xué)中,匯編語言往往不是作為一門單獨(dú)課程來教學(xué),而是嵌入到微機(jī)原理與接口技術(shù)課程中,作為一門工具語言來學(xué)習(xí)。因此,學(xué)習(xí)匯編語言的目的不再是熟練運(yùn)用匯編語言,而是可以更好地理解高級語言的實現(xiàn),更好地理解計算機(jī)底層硬件的工作過程,從而提高對計算機(jī)系統(tǒng)的整體認(rèn)識,提高程序設(shè)計開發(fā)的能力。
教學(xué)指導(dǎo)思想的調(diào)整,同時意味著教學(xué)內(nèi)容及教學(xué)重難點(diǎn)的調(diào)整。目前我校的匯編語言是放在微機(jī)原理與接口技術(shù)課程中介紹。由于課時有限,匯編語言的課堂教學(xué)內(nèi)容進(jìn)行了刪減,只介紹尋址方式、與后續(xù)程序結(jié)構(gòu)實現(xiàn)有關(guān)及與接口編程有關(guān)的指令。教學(xué)過程中淡化了對復(fù)雜問題的編程解決,而側(cè)重于介紹規(guī)律性的知識;側(cè)重于介紹匯編語言順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)及子程序結(jié)構(gòu)的實現(xiàn)語句,并與高級語言程序結(jié)構(gòu)進(jìn)行對比;側(cè)重于匯編語言在接口編程中的使用,以突出匯編語言的優(yōu)勢。對匯編語言與高級語言中輸入輸出環(huán)節(jié)進(jìn)行了對比,學(xué)生可以理解字符編碼的使用,可以理解高級語言是通過語言自帶函數(shù)來處理字符編碼與不同數(shù)據(jù)類型間的轉(zhuǎn)化。對于課堂上未介紹到的內(nèi)容,則鼓勵學(xué)生通過MOOC、閱讀參考資料、搜集網(wǎng)絡(luò)資源進(jìn)行自學(xué),并在通過實驗檢驗學(xué)生的學(xué)習(xí)效果。
2 實驗教學(xué)設(shè)計
實驗環(huán)節(jié)設(shè)計。實驗分為基礎(chǔ)實驗、提高性實驗、硬件實驗?;A(chǔ)實驗,例如通過DEBUG調(diào)試工具認(rèn)識不同尋址方式的機(jī)器代碼,從而學(xué)生可以理解什么是立即數(shù),什么是內(nèi)存操作數(shù)。在匯編語言程序設(shè)計實驗中,將源程序與反匯編的結(jié)果進(jìn)行對比,如圖1。學(xué)生可以認(rèn)識到指令與偽指令的區(qū)別,可以看到可執(zhí)行文件中沒有偽指令,段名DATA處理為立即數(shù)07A6H,變量名STR1處理為數(shù)值地址[0000H]。
提高性實驗,可以采用課程設(shè)計的方式,分組完成實驗。給定題目,具體實現(xiàn)效果由學(xué)生自行決定。課時有限時,也可通過一個綜合實驗考查學(xué)生編程能力,如主程序中設(shè)計界面,輸入符合要求,調(diào)用子程序?qū)崿F(xiàn)某項功能,輸入不符合要求時,則給出相應(yīng)提示信息。該實驗難度彈性較大,有的學(xué)生自學(xué)能力比較強(qiáng),可以實現(xiàn)輸入字符串密碼,對字符串密碼進(jìn)行比較,并考慮利用循環(huán)結(jié)構(gòu)控制密碼輸入的次數(shù),子程序則實現(xiàn)冒泡排序算法;基礎(chǔ)比較薄弱的學(xué)生,則可以實現(xiàn)單個字符的比較,子程序可以實現(xiàn)數(shù)據(jù)的二進(jìn)制形式輸出等。教師可以根據(jù)學(xué)生的學(xué)習(xí)情況,提出不同要求,有利于學(xué)生學(xué)習(xí)興趣的提升。
硬件實驗的設(shè)計,主要結(jié)合了接口部分的內(nèi)容。例如接口擴(kuò)展實驗,8253實驗,8255實驗等。這些實驗的完成不僅需要學(xué)生具備匯編語言的編程基礎(chǔ),還需要掌握接口芯片的功能,特別是理解軟硬件之間的關(guān)聯(lián)。
3 教學(xué)中遇到的問題及解決方法
DEBUG調(diào)試工具使用繁瑣。目前的解決方法,一是使用仿真軟件的集成環(huán)境,簡化操作過程。例如Proteus 8.0及以上版本,就可以支持對8086系統(tǒng)的仿真,可以完成匯編程序的編程及調(diào)試。二是可以使用Masm for Windows集成實驗環(huán)境,同樣也很方便。不過這些方法都是對原有匯編程序編寫、調(diào)試、運(yùn)行環(huán)境的仿真和集成,從理解計算機(jī)工作原理的角度看,學(xué)生仍然應(yīng)該對DEBUG調(diào)試工具有所了解,注意對存儲器內(nèi)容和地址的理解,可以把多種實驗方法結(jié)合起來進(jìn)行教學(xué)。
教材中匯編語言編程存在細(xì)節(jié)缺失的問題。由于匯編語言在實際工作中使用面越來越小,主要是在操作系統(tǒng)內(nèi)核及外設(shè)的驅(qū)動程序中使用,普及率降低,教材中對匯編語言的介紹也偏向于基礎(chǔ)知識、常用指令的介紹,有些細(xì)節(jié)就被省略了。而在實驗過程中,這些缺失的細(xì)節(jié)會對結(jié)果產(chǎn)生影響。大部分教材中,對DOS系統(tǒng)功能調(diào)用介紹的都比較簡單,因此學(xué)生在實驗中就出現(xiàn)了一些問題。如編程完成鍵入一個大寫字母,轉(zhuǎn)化成小寫字母輸出,指令如圖2所示,通過DOS系統(tǒng)功能調(diào)用可實現(xiàn),1號功能輸入單個字符,加上20H完成轉(zhuǎn)換,最后用2號功能輸出單個字符,運(yùn)行結(jié)果如圖3。有學(xué)生對程序進(jìn)行優(yōu)化,增加了9號功能輸出字符串,做一個簡單界面,代碼如圖4,但運(yùn)行結(jié)果與期望不符,無論輸入什么字符,輸出總是為“D”,如圖5。原因何在?通過DEBUG調(diào)試發(fā)現(xiàn),執(zhí)行完9號功能后,系統(tǒng)將AL值改為24H,加上20H后正好是“D”的ASCII碼,如圖6,即9號功能調(diào)用會改變AL的值,從而使最終結(jié)果發(fā)生改變。這一點(diǎn)在教材中未有提及。了解原因后,只需要在9號功能使用的前后注意對AL的保護(hù)與恢復(fù),就能使程序達(dá)到預(yù)期結(jié)果。對于出現(xiàn)的類似問題,一般會引導(dǎo)學(xué)生通過對程序的調(diào)試,找到原因,思考解決問題的方法,授人以魚不如授人以漁。
教學(xué)課時緊張。現(xiàn)在原理性的專業(yè)課課時進(jìn)行了壓縮,同時更強(qiáng)調(diào)實驗,重在培養(yǎng)學(xué)生的動手能力。這樣一來就不可能很深入地介紹匯編語言。學(xué)生在實驗過程中不可避免地出現(xiàn)了很多問題。因此學(xué)生的學(xué)習(xí)目標(biāo)、學(xué)習(xí)要求就要進(jìn)行相應(yīng)的調(diào)整。實驗的設(shè)計應(yīng)該由淺入深,具體內(nèi)容可以分層次完成。例如在子程序的設(shè)計與實現(xiàn)中,布置的題目是求N的階乘,將此功能作為一個子程序,在主程序中完成數(shù)據(jù)的輸入與輸出。最低要求可以實現(xiàn)0~9的階乘計算,中等要求在實現(xiàn)程序基本功能的基礎(chǔ)上,對結(jié)果進(jìn)行分析,提出改進(jìn)思路,最高要求可以實現(xiàn)0~255的階乘計算。學(xué)生可以根據(jù)自身情況,選擇不同的完成要求。
4 總結(jié)
目前的匯編語言教學(xué)應(yīng)該側(cè)重于基礎(chǔ)知識的介紹,同時可以注意與高級語言的對應(yīng)關(guān)系,學(xué)生的學(xué)習(xí)目的是通過對該門語言的學(xué)習(xí),了解計算機(jī)底層解決問題的思路和方法,理解計算機(jī)的工作原理,掌握對接口的編程方法等。同時,也應(yīng)為感興趣及學(xué)有余力的學(xué)生留有余地,有條件地因材施教。
【參考文獻(xiàn)】
[1]周荷琴,馮煥清.微型計算機(jī)原理與接口技術(shù)[M].合肥:中國科學(xué)技術(shù)大學(xué)出版社,2013:48-154.
[2]詹林,劉向舉.匯編語言程序設(shè)計課程教學(xué)犯法[J].科技經(jīng)濟(jì)導(dǎo)刊,2016(31):189.
[3]刁紅軍,楊季文.匯編語言實驗教學(xué)與實踐[J].計算機(jī)教育,2015(15):97-99.