摘要:匯編語言是計算機相關專業的重要的專業基礎課,也是公認的難教難學的課程。本文從匯編語言本身的特點、學生對學習匯編語言重要性的認識以及教師的教學等三個方面分析了造成這一現象的原因,并提出了一些解決辦法。
關鍵詞:匯編語言 重要性 debug 教學方法
在計算機及相關專業的專業基礎課中,匯編語言有著重要的地位。它是認識計算機系統的重要途徑,是一門實踐性很強的課程。掌握它有助于提高學生對計算機系統工作原理的理解、研究、設計和應用能力。另外,它也是微機原理、單片機原理、操作系統、編譯原理等課程必須的先修課。
但是,在對匯編語言教學過程中,卻遇到了困難:許多學生在學習匯編語言的過程中往往感覺找不到頭緒,認為匯編語言是一門難學的課程,比較抽象,不像應用型課程非常直觀與生動,在學習匯編語言時積極性不高。通過對匯編語言課程幾年的教學實踐,我認真思考分析了造成匯編語言難教難學的原因,并探索著找出了解決問題的辦法。
一、匯編語言本身的特點使得它難教難學
匯編語言屬于低級語言,與具體的計算機結構密切相關,編寫程序時不僅要考慮待解決問題本身的邏輯,還要考慮計算機硬件資源的使用,另外調試程序也很復雜。
1. 與硬件的相關性。匯編語言硬件依賴性強,它要直接使用CPU的資源,相對高級程序設計語言來說,它顯得難掌握。
不同類型的CPU有不同的機器指令系統,也就有不同的匯編語言。所以,除了同系列、不同型號CPU之間的匯編語言程序有一定程度的可移植性之外,其它不同類型(如小型機和微機等)CPU之間的匯編語言程序是無法移植的,也就是說,匯編語言程序的通用性和可移植性比高級語言程序低。
2. 編寫程序的復雜性。匯編語言功能有限,又涉及寄存器、內存單元等硬件細節,所以編寫程序比較繁瑣。
匯編語言是一種面向機器的語言,其匯編指令與機器指令基本上是一一對應的。所以,匯編指令也同機器指令一樣具有功能單一、具體的特點。要想完成某項任務,就必須安排CPU工作的每一個步驟,這就使得編寫匯編語言程序比較繁瑣、復雜。
3. 調試程序的復雜性。在通常情況下,調試匯編語言程序要比調試高級語言程序困難。
首先,匯編語言指令涉及到機器資源的細節,在調試過程中,要清楚每個資源的變化情況。比如在調試分支或者循環結構的程序時,往往要根據前一條指令的執行結果來決定是否發生轉移,這時就要清楚前一條指令執行以后標志寄存器中各個標志位的狀態。其次,程序員在編寫匯編語言程序時,為了提高資源的利用率,往往會使用各種技巧,而這些技巧完全有可能破壞程序的可讀性。最后,高級語言程序幾乎不顯式地使用轉移語句,但匯編語言程序要用到大量的、各類轉移指令,這些跳轉指令大大地增加了調試程序的難度。如果在匯編語言程序中也強調不使用轉移指令,那么匯編語言程序就會變成功能單調的順序程序,這顯然是不現實的。
二、學生對學習匯編語言的重要性認識不夠
從19世紀80年代開始,伴隨著編譯器技術的發展,CPU性能的不斷提升,匯編語言的名聲卻每況愈下,人們開始把這種語言判定為“dead language”,認為不再需要這種語言了,學生沒有認識到學習匯編語言的重要性,甚至把這門課當成大學教學與時代發展脫鉤的典型例子,對它產生了心理上的排斥,失去了學習這門課的興趣,更談不上主動地學習。在教學過程中,我們要糾正學生的錯誤認識,教育學生匯編語言“低級”并不意味著“無用”。事實上,正因為匯編語言的“低級”,程序員用匯編語言編寫程序時,才有可能充分發揮自己的聰明才智,對機器內部的各種資源進行合理的安排,編寫出運行速度快、指令序列短小的目標程序。
匯編語言在今天已經不再像過去一樣被普遍地使用了,但是學習匯編語言會幫助你明白計算機是如何工作的。在使用高級語言編程時,并不一定非得用匯編語言做什么,而使用匯編語言的經驗可以讓你明白什么樣的代碼在機器上運行更加高效。匯編語言的根本作用在于解釋硬件、解釋硬件的那些可編程實現的行為。使用高級語言而不是匯編語言,目的是為了提高編程效率;使用匯編語言而不是高級語言,目的是為了對硬件描述,實現操作系統無關性,應用于各種獨特的領域。
三、在教學方面存在的問題及解決方法
學校和教師首先應當認識到學習匯編語言的重要性,才能潛心研究提高匯編語言教學質量的方法。下面從教學形式、教學過程設計和教學方法等方面分析當前匯編語言教學方面存在的問題并給出解決方法。
1. 在教學形式方面?,F在許多學校把“匯編語言”與“微機原理”課程結合起來,作為其中的一個重點內容。這種教育形式側重指令系統以及基本匯編語言偽指令、編程方法,與硬件相結合是其最大的優勢。但受限于學時和課程重點,匯編語言的內容未能全面展開。這種方式適合于偏重硬件和接口應用開發的專業。對于偏重軟件、程序開發方面的專業,應單獨作為一門課程。這種教學形式可以比較全面地掌握指令系統、匯編語言各種程序結構設計、實用的混合編程等,有利于比較深入的學習。在學校教學中,應根據學生的專業選擇適當的教學形式。
2. 在教學過程設計方面。一般的匯編語言教學過程忽視了培養學生的實踐能力和解決問題的能力,課堂氣氛沉悶,學生學習枯燥??煽紤]從下面三個方面來提高教學效果。
首先,培養學生對匯編語言的興趣。在整體的教學設計上,一開始就應當讓學生明白為什么要學習匯編語言,繼而對匯編語言產生興趣。在匯編語言教學的開始,要通過具體的程序,使學生真正認識到匯編語言相對于其他語言特別是高級語言的優點。比如,計算z=x+y,用C語言編寫程序要短得多,也易于理解,但是比較一下它們各自生成的.exe文件,就會發現匯編語言的妙處。C語言編寫的源程序經過編譯連接以后生成的.exe文件占用9506個字節,而匯編語言編寫的源程序經匯編連接后生成的.exe文件只占用640個字節,相差14.85倍。這樣匯編語言的空間效率就很直觀了,學生對此也產生了興趣。
其次,適當調整教學次序。指令系統是匯編語言中最枯燥的部分,許多教材為了系統地介紹指令系統,往往將它們集中在一起,并且放在課程的前面。大量指令一下子呈現在學生面前,學生學得一知半解,不知道指令在編程中的作用到底是什么,記憶不牢固,學了后面的忘了前面的。這樣往往會導致學生產生厭學情緒,影響教學效果。在教學時,盡量將指令穿插到其他內容中,先通過具體的程序介紹匯編語言程序的格式,給學生一個總體的印象。將來學習其他內容的時候(順序、分支、循環結構以及子程序等等)分散講解指令,并通過對程序的調試增強對指令的理解,便于學生記憶。
最后,要強調實踐環節。匯編語言是一門實踐性很強的學科,只有通過實際編程和上機實踐才能掌握程序設計技術,并使其達到較高水平。教學過程中適當增加上機實踐的課時,讓學生在實踐過程中學習和體會匯編語言。另外,要讓學生掌握debug的常用命令,學會使用debug調試程序的方法,引導學生注意程序執行時用到的內存單元、各個寄存器以及標志寄存器中各個位的變化。這樣,有利于學生更好地理解指令,掌握編程方法。
3. 在教學方法方面。由于匯編語言本身的特點導致了學習難度大,我們更要選擇適當的教學方法以幫助學生更好的掌握匯編語言。
首先,在匯編語言的學習過程中經常要分析數據在內存中的存放情況(比如講解數據定義偽指令、中斷向量表的作用等),這時,圖示法能夠達到事半功倍的效果。有這樣一道典型題目:執行下面的程序段后,分析AX中的內容是什么。
TABLE DW 10,20,30,40,50 ......
LEA BX,TABLE
ADD BX,3
MOV AX,
把這道題目呈現給學生時,很多學生想當然地認為,BX中一開始存放的是TABLE的首地址,也就是指向了第1個數據,加上3,則指向了第4個數據,用寄存器間接尋址得到的數據一定就是40了。但是如果畫出TABLE在內存中存放的示意圖。就會發現結果是錯誤的。TABLE定義為字類型,那么一個數據占用兩個字節單元,在內存中以二進制形式存放。為了方便記數,我們用16進制形式表示。通過示意圖我們很清楚地看到正確的答案應該是1E00H。
其次,學生學習匯編語言以前已經學過了至少一門高級語言,在學習匯編語言的過程中就可以使用類比法。比如循環結構的程序由四個部分組成,分別是初始化部分、工作部分、修改部分和控制部分,我們可以和C語言的for語句進行類比。for語句的格式是:
for(表達式1;表達式2;表達式3)
語句;
如果把匯編語言的四個組成部分放到for語句中,則變成:
for(初始化部分;控制部分;修改部分)
工作部分;
這樣一比較,循環結構的組成就很容易理解了。這樣做學生既加深了對新知識的理解,又復習了學習過的知識。
再次,利用對比法來形成比較。講到“循環程序的效率”這一知識點時,我們知道,選擇長度短的指令可以提高程序的效率,例如將寄存器AX清零,可以采用下面兩種不同的方法:
MOV AX,0和XOR AX,AX
第一條指令長度為3個字節,執行花費4個時鐘周期,第二條指令長度為2個字節,執行花費2個時鐘周期。這樣對比,就可以直觀的得出結論。
另外,對“存儲器操作數尋址方式”的講解也可以使用對比法。比如完成同一個功能,分別用不同的尋址方式實現,有利于學生對各種尋址方式的理解。
最后,可以利用多媒體課件演示難以理解的內容。比如講述匯編語言中尋址方式、子程序調用的堆棧變化過程、模擬中斷調用動態過程時,運用多媒體動畫教學,可使學生一目了然地看到指令執行時內存及寄存器的變化過程,加深對問題的理解,收到將抽象的問題形象化、復雜的問題簡單化、枯燥的問題生動化的效果。
以上從三個方面分析了造成匯編語言課程難教難學的原因,并提出了一些解決的辦法,希望能夠起到拋磚引玉的作用。