陳 璨,李 林,任旭虎
談到匯編語言,可能很多人首先想到的就是它的缺點:語句抽象、編程效率低,晦澀難懂、調試困難、不易維護[1-2];可移植性差,語法規(guī)則非常復雜、指令繁多不易記憶、學起來枯燥無味;是一門實際應用中已被諸如C、C++、JAVA及其他可視化編程語言所取代的 “低級”語言。而對于匯編語言的優(yōu)點卻很少有人提及,提到的僅僅是:匯編語言實時性強、代碼效率高、運行速度快、節(jié)約內存空間[3-5]。因此,業(yè)界許多學者和 “專家”認為學習匯編語言沒有用,從而形成了匯編語言已是“明日黃花”不再滿足現在編程需要的印象。
與之相應的是隨著高等教育改革步伐的加快和受 “就業(yè)率”這個指揮棒的驅使,許多高校大大縮減匯編語言學時,有的高校甚至直接取消匯編語言這門課程,將C語言作為計算機、電子、自動化等電類專業(yè)的一門專業(yè)基礎課程,更有許多教師單純地強調C語言是一門最接近底層的語言,是一門 “硬件編程語言”。然而結合自身的成長經歷和多年的實踐教學經驗,本文認為此舉真是 “得不償失,毀人不倦”!匯編語言不但不能被拋棄、壓縮學時,反而應當作為一門非常重要的專業(yè)基礎課程,尤其是對于電類專業(yè)的學生來說,匯編語言就像高等數學、大學英語等課程一樣重要。正因為認識到匯編語言在培養(yǎng)學生實踐動手能力和宏觀思維能力方面具有先天的優(yōu)勢,本文在電子設計競賽賽前培訓過程中創(chuàng)造性地引入匯編語言學習和訓練,取得了一定的成績。
匯編語言是介于硬件和軟件之間的一門編程語言,在電類專業(yè)學生掌握專業(yè)技能、提高實踐動手能力等方面具有明顯的優(yōu)勢[6-8],主要表現在以下幾個方面。
1)匯編語言向下能夠直接操作硬件。
匯編語言是一種符號化的機器語言,一條匯編指令就對應一個機器碼,每一步執(zhí)行什么動作都很清楚[4]。匯編語言可以直接操作處理器的內部寄存器、各個外設、外部I/O端口以及各種外圍電路,編程者能夠徹底理解和感受到 “數字邏輯”里面的 “0”“1”和電路課程里面的電平電壓之間的對應關系。通過匯編語言的學習使用,能夠讓學生將以前所學課程貫穿起來,建立自身的知識體系。
2)匯編語言向上可以理解軟件。
匯編語言能夠讓編程者更好地理解高級語言,尤其是高級語言中的C語言。例如匯編語言對于內存的操作都是基于內存地址的,而C語言的難點就是指針概念。指針應用中最難以理解的就是指針這個抽象概念和實際內存單元之間邏輯映射關系是如何建立的,而這些恰恰是在匯編語言學習中容易理解和掌握的一件事情。同樣,對于C語言中的數據類型、形參和實參、函數調用、全局變量、局部變量等概念及操作,都可以用匯編語言中的一些操作建立聯系。把這些抽象概念和過程通過匯編語言形成一個具體的映像,深度剖析,這樣才能真正地學會、學好和用好C語言。有了匯編語言的基礎,那些面向對象的編程語言學習起來就更加得心應手。
3)建立軟硬結合的編程體系、遵循循序漸進的學習規(guī)律。
如前所述,在使用匯編語言的時候,能夠感知計算機的運行過程和原理,從而能夠對計算機硬件和應用程序之間的聯系形成一個清晰的認識,即向上理解軟件,向下直接操作硬件[8]。這也是最能夠鍛煉編程者編程思維邏輯的,只有這樣,學習者才能形成一個軟硬兼?zhèn)涞木幊讨R體系,這是學習任何高級語言都無法完成和實現的,相對于復雜的高級語言,匯編語言的指令操作更為直接,從匯編開始學習計算機相關知識更符合循序漸進的學習規(guī)律。因此,對于電類專業(yè)的學生,學習和掌握匯編語言是非常重要的。
用匯編語言編寫實際應用程序,需要編程者徹底掌握以下5個方面內容:1)系統(tǒng)的硬件資源;2)軟件的功能需求;3)實現軟件功能所需要的子程序模塊;4)軟件的執(zhí)行流程 (例如,系統(tǒng)啟動后第一步干啥、第二步干什么……;系統(tǒng)會在什么時候產生中斷,中斷服務程序應該做些什么工作……);5)程序的執(zhí)行效率。經過以上5個方面的鍛煉,編程者的宏觀思維能力會在無形中得以提升,這些是其他高級語言所不具備的。本文認為用匯編語言編寫過大的應用程序的人做任何事情都會顯得思路清晰、條理分明[9-10]。在此列舉兩個在教學中發(fā)現的比較典型的例子。
1)2012年山東省大學生電子設計競賽,其中測量電參數的題目需要用到FFT運算,某團隊的學生采用了C8051F120單片機作為控制核心,并用C51語言編寫控制程序。學生在程序里開辟了4個2 KB的int型數組作為FFT運算處理的緩存,程序編寫完通過keil環(huán)境編譯后沒有發(fā)現任何語法錯誤,但實際運行時程序就 “跑飛”,就這個錯誤該隊學生整整調試了一天卻找不出任何問題,從而放棄了最終比賽。用過這款單片機的都知道C8051F120單片的RAM空間只有8 448 Byte,而該隊學生僅用于FFT運算的緩存就有4×2 K×2=16 KB。如果有過匯編語言的編程經驗,在最初做方案時把這些底層的硬件資源和軟件需求一并考慮進去,適當地把緩存空間改小,問題就可迎刃而解。
2)2013年全國大學生電子設計競賽賽前培訓期間,指導老師要求學生用單片機測量一個直流電壓,并通過液晶顯示器把測量結果顯示出來,同時指導老師給出了AD和液晶顯示器的程序例程。某團隊學生在搭建好硬件電路后,分別利用指導老師給的例程進行測試,AD和液晶顯示器工作正常;但將兩個例程整合到一起后,調試不成功,要么只有AD工作,要么是液晶顯示器上顯示亂碼。后來發(fā)現學生將指導老師的兩個例程都導進了自己新建立的工程里面,把原來例程的主函數 (main函數)分別改為 “main1” 和 “main2”并在自己的主函數里面調用main1和main2。用匯編語言編寫過單片機應用程序的人都很清楚單片機主程序其實是在不停地循環(huán)執(zhí)行,上述改動后其實就只有一個函數一直在循環(huán)執(zhí)行。如果學生有匯編語言設計基礎,就不容易犯這樣的低級錯誤[11-12]。
基于此,在2014年山東省大學生電子設計競賽賽前培訓的單片機訓練部分,本文改變了以往一開始就讓學生利用C51開發(fā)C8051F120單片機程序的培訓方法,改為先由指導教師集中講解MCS51單片機結構和指令集 (只講知識點);然后讓學生利用兩周的時間去熟悉各條指令,并用匯編語言編寫并調試了數碼管動態(tài)顯示、直流電壓信號采集、矩陣鍵盤掃描并利用串口傳輸鍵碼、方波信號頻率測量等幾個功能相對復雜的程序;最后再由指導教師講解C8051F120單片機和C51程序開發(fā)。經過一個暑假的訓練,指導教師反映效果良好,學生有了匯編語言和原有計算機C語言基礎后,C51入門較快,對C8051F120單片機內部資源了解清楚,編寫的程序思路清晰。在接近培訓尾聲的實戰(zhàn)訓練中,學生對題目的理解程度、軟硬件設計方案及題目的完成度明顯高于往年。同時在2014年山東省大學生電子設計競賽中中國石油大學 (華東)學生的獲獎級別、獲獎率明顯高于往年,學校的參賽質量名列山東省大學生電子設計競賽的前茅。
經過前面的論述,可知匯編語言在培養(yǎng)學生實踐動手能力、邏輯思維能力、宏觀思維能力以及其他方面的能力都具有十分重要的作用,因此有必要重新認識匯編語言并給予準確定位[13-16]。
1)匯編語言在電類專業(yè)中的基礎地位不可輕易動搖。
匯編語言是培養(yǎng)學生理解硬件資源的語言,是學習和理解其他高級程序設計語言的基礎,是計算機組成原理、接口與通信技術、計算機控制技術和數據采集等許多專業(yè)課的前導課程,是必要的基礎知識,起著承上啟下的作用。匯編語言課程,依然應該是高校計算機及其相關專業(yè)學生的必修課[8]。說匯編語言是 “低級”語言,并不意味著匯編語言會被更高級語言所取代,相反,這里的 “低級”應該當 “基礎”講[7],在學生能力培養(yǎng)中的 “基礎”地位是不能輕易動搖的。
2)要拋棄匯編語言無用之說。
雖然隨著半導體技術、編程技術的不斷發(fā)展,在實際工程應用中確實很少看到匯編語言的身影,但這并不能說明匯編語言沒用,已被其他高級語言所取代。嵌入式系統(tǒng)的底層驅動、計算機的BIOS不都還是用匯編語言來實現的嗎?如果匯編語言真的沒用,為什么每年的雙選會場上還是有那么多知名企業(yè)要求應聘者掌握匯編語言和用匯編語言編程呢?匯編語言有用,只是熟練掌握的人太少。
匯編語言的教學模式和教學態(tài)度需要盡早改變。目前各高校普遍反映匯編語言教學存在 “教師難教、學生難學”的現象,但不能因此而放棄匯編語言教學和學習,動搖其基礎地位。相反,應當積極尋找有效途徑來改變這種現狀。例如,在教學模式上拋棄以往那種單純的、枯燥無味的指令講解,相應的利用動畫形式來展示指令在CPU中的執(zhí)行過程,同時以功能相對完善、具有一定實用價值、貼近生活實際的程序片段作為案例進行分析,以此來活躍課堂氣氛;同樣,作為理論課教師需要改變匯編語言的教學觀念和態(tài)度,不要把自己的興趣愛好和個人價值取向貫穿于教學中,要告訴學生學習匯編語言的目的不是用它去找工作,而是通過匯編語言的系統(tǒng)學習和應用能夠提高其自身的各方面能力,就像我們學習了高等數學,在實際工作中并不一定需要你天天去做微積分,但是它在我們各方面能力培養(yǎng)中奠定的基礎是不容忽視的。
匯編語言是一門直接操作底層硬件的編程語言,在計算機的發(fā)展歷程中有著不可磨滅的貢獻。本文認為雖然不能倡導學生天天用匯編,但要讓學生會用匯編,理解匯編,知道匯編的精華。在高等教育中,匯編語言是計算機、通信、電子和自動化等電類專業(yè)的一門非常重要的基礎課程,起到承上啟下的作用,在學生實踐動手能力、邏輯思維能力、宏觀思維能力的培養(yǎng)方面有著舉足輕重的地位。
[1]張富貴,黃海松,呂敬堂,等.單片機設計性實驗與工程實踐能力的培養(yǎng)[J].實驗技術與管理,2011,28(2):135-138.
[2]趙月靜,陳繼榮,張永弟.單片機原理及應用課程創(chuàng)新實踐教學改革[J].實驗技術與管理,2013,30(1):176-179.
[3]穆洪偉.匯編語言魅力不減當年——MCU匯編語言的“工程”化[J].電子世界,2012(8):77-79.
[4]黃勤,李楠,胡青,等.計算機硬件技術基礎課程體系優(yōu)化及實踐[J].實驗室研究與探索,2011,30(10):290-292.
[5]龐新法.匯編語言授課方法[J].價值工程,2014(22):200-201.
[6]熊書明,王良民,曾宇,等.基于程序設計的 “匯編語言”課程教學方法[J].電氣電子教學學報,2013,35(6):66-68.
[7]王志軍.微機原理教學中幾個問題的探討[J].計算機教育,2010(7):64-66.
[8]許家瑞.構建創(chuàng)新實驗教學體系的探索與實踐[J].實驗技術與管理,2009(5):1-4.
[9]張雪蘭.匯編語言程序設計[M].北京:北京理工大學出版社,2001.
[10]陳依依.計算機匯編語言特點分析[J].山東大學學報,2013(5):67-69.
[11]陳國良,董榮勝.計算思維與大學計算機基礎教育[J].中國大學教學,2011(1):7-11,32.
[12]于慶梅,毛镠,馮國富,等.匯編語言程序設計課程微實驗教學模式探討[J].計算機教育,2014(22):111-114.
[13]刁紅軍,楊季文.匯編語言實驗教學與實踐[J].計算機教育,2015(15):97-99.
[14]安楊,趙波.“匯編語言程序設計”課程教學改革的研究[J].電氣電子教學學報,2007,29(6):7-9.
[15]劉道文.高校非計算機專業(yè)計算思維能力培養(yǎng)策略研究與實踐[J].計算機教育,2013(13):39-43.
[16]劉光蓉.以計算思維能力培養(yǎng)為導向的C程序設計實驗教學[J].實驗技術與管理,2013,30(1):154-156.