摘要:基于比較教學法的優勢,文章從數據安排、數據處理、流程控制、子程序結構等程序設計的基本方面對匯編語言和高級語言中的相關機制作了對比分析,提出了“匯編語言程序設計”比較教學的基本思路。
關鍵詞:匯編語言程序設計;高級語言程序設計;比較教學法
“匯編語言程序設計”是計算機相關專業的一門重要課程,目前國內大部分院校的相關專業都有開設。從時間上看,“匯編語言程序設計”一般開設在大學二年級,從課程的銜接上看,則一般開設在“高級語言程序設計”和“計算機組成原理”之后。
匯編語言也好,高級語言也好,它們都只不過是程序設計的工具,因此對于程序的基本功能和程序設計的基本問題,它們都有相應的實現機制,而且在很多方面都是相通的,尤其是在程序設計的基本思想方法上。但匯編語言和高級語言畢竟是兩種不同的語言類別。從源程序的基本單位——語句的層面看,高級語言語句的功能遠比匯編語言語句即各種指令和偽指令的功能要強大。此外即便是同樣的問題,如數據安排、數據處理、流程控制、子程序結構等,它們的實現機制也不一樣。
效率最高的教學方法首推比較教學法(或叫類比教學法),也就是將新的陌生的東西和舊的熟悉的東西做比較,找出它們之間相同的地方和不同的地方,然后進行差異化的學習,重在存同求異,這樣就會事半功倍。
因此,筆者在多年從事“匯編語言程序設計”的教學中,特別注重以學生在學習高級語言程序設計課程時所獲得的知識和體驗為基礎,將匯編語言和高級語言進行比較教學。
本文就是這一教學方法的經驗總結。
1數據的組織安排
程序是用來加工處理數據的,因此程序設計工作離不開數據的組織安排。數據的組織安排就是指為程序加工處理的數據安排合適的空間并且組織好,以提高對數據加工處理的效率。從應用層面看,數據的組織安排通常包括3個方面:
(1)安排在哪?即空間位置問題。
(2)安排多大空間?即數據長度問題。
(3)存放什么樣的數據?即數據類型問題。
在數據空間的組織安排方面,匯編語言和高級語言的一個重要差別是:高級語言提供的是直接面向應用的數據類型,如C語言中的基本類型——整型(int)、浮點型(float)、字符型(char),而整型又有長(long)、短(short)之分,浮點型又有單精度(single)和雙精度(double)之分,此外還有有符號(signed)和無符號(unsigned)之分等。高級語言的數據類型是面向應用的,因此它們有兩方面的含義:類型特點和長度大小,這就解決了上述3個問題中的后兩個問題[1]。
在C語言中,數據除了有類型這個概念之外,還有類別之分,即存儲類別問題,共有4種:static、auto、register和extern。從嚴格意義上講,其中和數據空間的組織安排有關的只是前3種:static和auto對應的是內存空間,而register對應的則是寄存器空間,這又解決了上述3個問題中的第一個問題[1]。
與高級語言不同的是,匯編語言的數據類型是面向機器的,如MASM中的基本類型——DB、DW、DD、DQ、DT等,它們只有長度大小的含義,而且都是對應內存空間的,因此用它們定義的變量都屬于內存變量。
在匯編語言中,由于可以直接引用各個寄存器,而且各個寄存器的空間大小都是確定的,因此這些寄存器實際上就相當于C語言中的寄存器變量。
總之,在匯編語言中,數據一般只有空間大小和位置之分,而不管這個空間中存放什么樣的數據,即無類型之分。
因此,在用匯編語言設計程序時,對程序中的數據有一個面向應用的自我理解問題!這是在教學時應特別予以關注的!
2數據的加工處理
在數據的輸入輸出方面,匯編語言和高級語言也有重要差別。
以面向標準輸入輸出設備的數據輸入輸出為例,高級語言提供的也是直接面向應用的相關語句、函數和過程,如C語言中的fprintf、printf、sprintf、vprintf、vfprintf、vsprintf、fscanf、scanf、sscanf、fgetc、fputc、getc、putc、getchar、putchar、fgets、fputs、pus、gets等,這些函數基本上滿足了面向應用的各種類型數據的輸入輸出[1]。
匯編語言提供的則基本上是面向字符的中斷調用,即通過調用相關的中斷服務程序來實現數據的輸入輸出,如MASM中的常用的DOS提供的21H類中斷服務程序的1、2、8、9、10號功能等。
總之,高級語言提供的一般是直接面向應用的輸入輸出機制,而匯編語言提供的則一般是面向系統的輸入輸出機制。因此在匯編語言程序設計的教學中,如何利用面向系統的輸入輸出機制通過編程實現面向應用的輸入輸出功能是我們的又一個重點。
在數據的內部加工處理方面,高級語言和匯編語言都提供一序列的運算符。
在C語言中,這些運算符包括為數據傳送提供的賦值運算符“=”和為數據運算提供的算術運算符“+、-、*、/、%、++、--”、關系運算符“>、>=、<、<=、==、!=”、邏輯運算符“、||、!”和位運算符“、|、~、<<、>>”以及各種混合運算符等[1]。
在MASM中,這些運算符包括算術運算符:“+、-、*、/、MOD”,邏輯運算符:“AND、OR、NOT、XOR”,關系運算符:“EQ、NE、LT、GT、LE、GE”,移位運算符:SHR和SHL等[2]。
值得注意的是,除了形式上的差別外,高級語言的運算符和匯編語言的運算符在功能上也是有差別的:高級語言的運算符往往可以用在包括常量和變量的各種數據之間,而匯編語言的運算符則往往只能用在常量之間,對變量的加工處理則是依靠相應的指令來實現的。
3流程控制問題
為了實現流程控制,高級語言都提供有兩類基本語句:分支控制語句和循環控制語句,如C語言和PASCAL語言中的if語句、switch語句、for語句、while語句、do-while語句、case語句、repeat語句以及比較特別的goto語句等[1,3]。
匯編語言則提供有相應的流程控制類指令,如MASM中的無條件轉移指令(JMP)、條件轉移指令(JA、JB、JAE、JBE、JNZ、JZ、JG、JL、JGE、JLE、JO、JNO、JS、JNS、JC、JNC等)、循環控制指令(LOOP、LOOPZ、LOOPNZ)等[2,4-6]。
在功能上,匯編語言的轉移類指令既可以用于分支控制,也可以用于循環控制,而循環類指令則自然主要用于循環控制。它們的實現機制在高級語言中也有體現,如C語言中的goto語句。
從功能上看,C語言中的goto語句主要有兩種用法:
(1)goto標號;
(2)if條件goto標號。
前一種用法實現的正好是匯編語言中無條件轉移指令的功能,而后一種用法實現的則正好是匯編語言中條件轉移指令和循環控制指令的功能。
在用匯編語言寫分支控制程序時尤其要注意的是,由于只能一個分支一個分支的縱向展開,因此除最后書寫的分支外,前面的分支結尾處一般都應該有一條無條件轉移指令以跳過后面的分支,避免執行不該執行的分支。
例如:輸入一個字符,判斷其是否為數字‘9’,若是,則輸出字符‘Y’;否則,輸出字符‘N’。這是一個簡單的二分支問題,其匯編語言程序段如下:
MOV AH,1
INT 21H
CMP AL,‘9’
JZ YES;開始分支
MOV DL,‘N’ ;第一個分支
JMP EXIT;避免執行第二個分支
YES:MOV DL,‘Y’ ;第二個分支
EXIT:MOV AH,2;匯合點
INT 21H
匯編語言除了提供上述轉移控制類指令和循環控制類指令以實現分支程序設計和循環程序設計外,還提供有子程序和中斷服務程序的調用(CALL、INT)指令和返回(RET、IRET)指令以及比較特別的重復前綴指令(REP、REPZ、REPNZ)等。
匯編語言的子程序概念和高級語言中的子程序概念、函數概念以及過程概念是對應的,而中斷服務程序概念則一般是匯編語言獨有的。
如果僅從程序執行機制上看,子程序、函數、過程、中斷服務程序的地位是一樣的,只不過是在不同的語言環境中采用了不同的稱呼而已。
主程序和子程序、函數、過程、中斷服務程序之間的流程控制都是通過調用與返回實現的,差別是:在高級語言中,主程序和子程序、函數、過程之間的流程控制是通過直接引用子程序、函數或過程的名字(加上適當的參數)來實現的[1,3];而在匯編語言中,主程序和子程序、中斷服務程序之間的流程控制是通過前面提到的專門的控制指令(CALL、RET、INT、IRET)來實現的。
4子程序問題
前已述及,匯編語言的子程序結構相當于高級語言中的子程序、函數和過程。
在采用子程序結構時,一個重要的問題就是參數傳遞。主程序在通過調用子程序為自己解決某些問題時,通常需要為子程序提供一些相關的數據,子程序在內部對這些數據做相應的加工處理后應該將處理結果返回給主程序,這就是所謂的參數傳遞問題。主程序提供給子程序的數據通常叫做入口參數,而子程序返回給主程序的數據則通常叫做出口參數。
匯編語言子程序的參數傳遞和高級語言中子程序、函數或過程的參數傳遞機制從本質上看是一致的。
需要做參數傳遞時,通常有兩種選擇:一種方法是直接傳遞所需要的數據,另一種方法是傳遞所需數據的位置信息即內存地址。第一種方法即通常所說的值傳遞,第二種方法即通常所說的地址傳遞。需要注意的是,傳地址的目的也是為了傳數據。
從表象即實現形式上看,匯編語言子程序的參數傳遞和高級語言子程序的參數傳遞卻有著不小的差別。
在高級語言中,函數在定義時往往就有參數說明,如C語言的函數定義格式如下:
類型 函數名(形式參數表)
{
函數體
}
高級語言的函數在調用時需要同時提供參數,一般格式是:函數名(實際參數表)。而在匯編語言中,子程序在定義時不需要有關參數的說明,在調用時自然也就無需同時提供參數。
如在MASM中,子程序的定義格式為:
子程序名 PROC
子程序體
子程序名 ENDP
子程序的調用格式則為:CALL子程序名
由此可見,高級語言中函數的參數傳遞是顯式進行的,較之匯編語言子程序中隱式進行的的參數傳遞問題要易于實現和理解接受一些。因此,匯編語言中的子程序的參數傳遞問題就是教學中的一個重點內容。
在匯編語言中,為了實現子程序的參數傳遞,不管是采用值傳遞還是采用地址傳遞,都需要由程序設計者事先安排好一個第三方空間。值傳遞時將所需要的數據本身放在這個事先安排好的空間中,而地址傳遞時則將存放所需要的數據位置信息即內存地址放在這個事先安排好的空間里。
在安排用于參數傳遞的第三方空間時,既可以安排寄存器,也可以安排內存單元,還可以安排堆棧。因此具體的參數傳遞方式靈活多樣,而且各有各的優勢,在實際應用中通常綜合以上各種做法以求達到最佳效果[2,4-6]。
5結語
限于篇幅,以上僅就程序設計的幾個主要方面作了比較論述,而且主要是從實現機制的角度來談,因此細節的東西基本上都省卻了。事實上,在其他方面,匯編語言和高級語言也具有一定的可比性。
實踐證明,通過比較教學,一方面可以利用學生已有的知識和體驗幫助他們更好地學習匯編語言的相關知識,即把他們在高級語言程序設計中獲得的有關程序設計的基本思想方法和規律遷移到匯編語言程序設計的學習中來,進行差異化的學習,極大地提高學習效率;另一方面,可以讓同學們通過比較,把以前在學習高級語言程序設計時遺留的一些問題甚至沒有意識到的問題搞清楚,起到融會貫通、觸類旁通的作用。
總之,通過比較教學,不僅可以提高學生的學習效果和效率,而且新舊知識可以相得益彰。
參考文獻:
[1] 譚浩強. C程序設計[M]. 3版. 北京:清華大學出版社,2005.
[2] 曹加恒,蘇光奎,許先斌,等. 新一代匯編語言程序設計[M]. 北京:高等教育出版社,2003.
[3] 鄭啟華. PASCAL程序設計[M]. 2版. 北京:清華大學出版社,1996.
[4] (美)歐文. Intel匯編語言程序設計[M]. 5版. 溫玉杰,梅廣宇,羅云彬,譯. 北京:電子工業出版社,2007.
[5] 沈美明,沈冬嬋. IBM-PC匯編語言程序設計[M]. 2版. 北京:清華大學出版社,2001.
[6] 錢曉捷. 新版匯編語言程序設計[M]. 北京:電子工業出版社,2006.
The Comparative Teaching Method of “Assemly Language”
XIONG Xiao-bing
(Computer School, Wuhan University, Wuhan 430079, China)
Abstract: Based on the advantages of comparative teaching, this paper makes some analyses on asembly languages in contrast to advaned languages from the basic aspects of programming, including data arrangment, data processing, flow control and sub-program.
Key words: programming assembly language; advanced language; comparative teaching
(編輯:姚彥如)