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