熊小兵 劉丹
摘要:從匯編語言程序設(shè)計(jì)在計(jì)算機(jī)相關(guān)專業(yè)課程體系中的地位與作用出發(fā),說明在新形勢下繼續(xù)開設(shè)這門課程的一些基本問題,包括地位與作用、定位與內(nèi)容、重點(diǎn)與難點(diǎn)以及方法與評價(jià)等,闡述在教學(xué)中應(yīng)當(dāng)采取怎樣的對策以解決這類問題。
關(guān)鍵詞:匯編語言;程序設(shè)計(jì);課程改革
引 言
匯編語言程序設(shè)計(jì)作為一門獨(dú)立的課程在誕生之初,一直是各高校計(jì)算機(jī)專業(yè)的一門專業(yè)必修課。近年來,國內(nèi)一些高校(尤其是重點(diǎn)高校)的計(jì)算機(jī)相關(guān)專業(yè)在進(jìn)行培養(yǎng)方案修訂時(shí),大都對這門課程做了較大調(diào)整。有些學(xué)校將其由必修課改成選修課,有些學(xué)校將其課時(shí)做了較大壓縮,有些學(xué)校甚至干脆取消這門課。
1 地位與作用問題
匯編語言程序設(shè)計(jì)在所有專業(yè)課(含專業(yè)基礎(chǔ)課)中具有獨(dú)特的地位與作用。一直以來,計(jì)算機(jī)及其應(yīng)用系統(tǒng)的構(gòu)成基本上分為硬件和軟件兩大塊,計(jì)算機(jī)相關(guān)專業(yè)所涵蓋的學(xué)科理論知識與工程技術(shù)也相應(yīng)地分為硬件和軟件兩大塊。受此影響,在人才培養(yǎng)實(shí)踐中,計(jì)算機(jī)相關(guān)專業(yè)所開沒的基礎(chǔ)課程也主要圍繞這兩大塊展開。硬件主要有電子技術(shù)基礎(chǔ)、數(shù)字邏輯、計(jì)算機(jī)組成原理、系統(tǒng)結(jié)構(gòu)等,而軟件主要有數(shù)據(jù)結(jié)構(gòu)、高級語言程序設(shè)計(jì)、操作系統(tǒng)、數(shù)據(jù)庫等。
從硬件和軟件的關(guān)系看,計(jì)算機(jī)及其應(yīng)用系統(tǒng)的工作以硬件為基礎(chǔ),卻以軟件為動力,硬件和軟件密不可分,硬件要靠軟件驅(qū)動。一般而言,以計(jì)算機(jī)系統(tǒng)為核心的應(yīng)用開發(fā)必須是硬件開發(fā)和軟件開發(fā)同時(shí)伴隨,因此有些課程注定要同時(shí)圍繞硬件和軟件兩方面展開,如匯編語言程序設(shè)計(jì)、接口技術(shù)、單片機(jī)、嵌入式系統(tǒng)等。
在所有這些軟件和硬件緊密結(jié)合的課程中,匯編語言程序設(shè)計(jì)又是基礎(chǔ)課。通過學(xué)習(xí)匯編語言程序設(shè)計(jì),學(xué)生不僅可以更加透徹地理解在其他課程中學(xué)習(xí)過的有關(guān)知識,更加深入地了解計(jì)算機(jī)系統(tǒng)的內(nèi)部工作機(jī)制,而且能為后續(xù)接口技術(shù)、單片機(jī)、嵌入式系統(tǒng)等課程的學(xué)習(xí)打下堅(jiān)實(shí)基礎(chǔ)。
總之,匯編語言程序設(shè)計(jì)把硬件和軟件有機(jī)地緊密結(jié)合在一起,能讓學(xué)生對傳統(tǒng)意義上的兩大塊有一個更全面同時(shí)也更深入的認(rèn)識和理解。鑒于以上認(rèn)識,筆者認(rèn)為各高校計(jì)算機(jī)相關(guān)專業(yè)在進(jìn)行培養(yǎng)方案修訂時(shí)不宜完全取消匯編語言程序設(shè)計(jì)這門課程。
2 定位與內(nèi)容問題
程序設(shè)計(jì)語言經(jīng)歷了機(jī)器語言、匯編語言、高級語言等發(fā)展階段。從編程效率看,匯編語言不及高級語言,但從語言的整體功能看,匯編語言比高級語言要強(qiáng),通俗點(diǎn)說就是指高級語言能做到的事,匯編語言都能做到,但反過來則未必。
高級語言程序設(shè)計(jì)的主要內(nèi)容包括兩部分:高級語言和程序設(shè)計(jì)。匯編語言程序設(shè)計(jì)也不例外,其主要內(nèi)容也由兩部分構(gòu)成:匯編語言和程序設(shè)計(jì)。事實(shí)上,不管學(xué)習(xí)什么語言程序設(shè)計(jì),主要內(nèi)容就是兩個:程序設(shè)計(jì)的基本思想方法和語言本身。
由于語言只是程序的載體,是程序設(shè)計(jì)的工具,因此第1個內(nèi)容即程序設(shè)計(jì)的思想方法是相通的。鑒于此,匯編語言程序設(shè)計(jì)的教學(xué)應(yīng)該以匯編語言本身為重點(diǎn),即匯編語言為程序設(shè)計(jì)提供的各個元素及其應(yīng)用,內(nèi)容應(yīng)該包括數(shù)據(jù)表示、數(shù)據(jù)安排、尋址方式、指令系統(tǒng)、程序結(jié)構(gòu)、流程控制、參數(shù)傳遞、中斷調(diào)用、數(shù)據(jù)處理等;而其定位應(yīng)該是讓學(xué)生掌握最基本的知識和能力,一方面讓學(xué)生通過學(xué)習(xí)匯編語言深入理解計(jì)算機(jī)系統(tǒng)內(nèi)部的工作機(jī)制,另一方面能讓學(xué)生在必要時(shí)借助匯編語言彌補(bǔ)高級語言的功能性不足。
3 重點(diǎn)與難點(diǎn)問題
3.1 數(shù)據(jù)表示問題
計(jì)算機(jī)的基本功能就是加工處理數(shù)據(jù),數(shù)據(jù)需要存放到計(jì)算機(jī)系統(tǒng)中。實(shí)際應(yīng)用中的數(shù)據(jù)豐富多彩,具有各種不同的類型;而計(jì)算機(jī)中的數(shù)據(jù)則單調(diào)得多。應(yīng)用中各種不同類型的數(shù)據(jù)如何在計(jì)算機(jī)中以恰當(dāng)?shù)男问奖硎境鰜?,就是程序設(shè)計(jì)面臨的首要問題。
數(shù)據(jù)在計(jì)算機(jī)中的表示有多種方法,不同方法有各自的優(yōu)缺點(diǎn),適用于不同的應(yīng)用要求?;旧蟻碚f,計(jì)算機(jī)系統(tǒng)對數(shù)據(jù)的加工處理主要是數(shù)據(jù)運(yùn)算和數(shù)據(jù)輸入輸出。為了節(jié)約存儲空間,我們一般比較喜歡2進(jìn)制代碼長度比較小即2進(jìn)制代碼比較短的表示方法。在2進(jìn)制代碼長度方面,數(shù)值數(shù)據(jù)的代碼表示一般不如其2進(jìn)制表示。
計(jì)算機(jī)對數(shù)值數(shù)據(jù)最重要的加工處理就是算術(shù)運(yùn)算,為了方便運(yùn)算,我們比較喜歡2進(jìn)制表示,即在運(yùn)算方面數(shù)值數(shù)據(jù)的2進(jìn)制表示要優(yōu)于其代碼表示。采用2進(jìn)制表示的主要問題是溢出,但這同時(shí)也是代碼表示的主要問題之一。此外,代碼表示即使沒有溢出,也可能得到錯誤的結(jié)果。計(jì)算機(jī)對數(shù)據(jù)進(jìn)行加T處理時(shí),加工處理之前要輸入原始數(shù)據(jù),加工處理之后要輸出結(jié)果數(shù)據(jù),我們當(dāng)然希望采用比較有利于輸入/輸出的表示法。在這方面,數(shù)據(jù)的代碼表示要比其2進(jìn)制表示好。
代碼形式的數(shù)據(jù)在輸入/輸出時(shí)只需要采用簡單的移位操作即可實(shí)現(xiàn),因?yàn)槊恳晃簧系臄?shù)都有同樣長度的代碼,而且數(shù)據(jù)在輸入/輸出時(shí)本身就是通過代碼進(jìn)行標(biāo)識。例如,在西文環(huán)境中普遍采用ASCII碼標(biāo)識每一個常用字符,因此ASCII碼形式的數(shù)值數(shù)據(jù)在輸入/輸出時(shí)特別有優(yōu)勢:輸出時(shí)只需要8位8位的進(jìn)行分割,就可以得到每一位上的數(shù),而且不需要做任何轉(zhuǎn)換就可以送往輸出設(shè)備輸出;輸入時(shí)不需要做任何轉(zhuǎn)換,只需要8位8位的進(jìn)行拼接,就可以得到整個數(shù)。如果是2進(jìn)制形式,則要麻煩得多:輸出時(shí)需要通過除法等分離出每一位上的數(shù),然后轉(zhuǎn)換成ASCII碼后才能送往輸出設(shè)備輸出;輸入時(shí)需要將ASCII碼轉(zhuǎn)換成對應(yīng)的一位數(shù),然后通過乘法和加法等拼成一個整體。
總之,學(xué)生要學(xué)會在深刻理解并熟練掌握各種數(shù)據(jù)表示方法的基礎(chǔ)上,善于根據(jù)需要靈活選擇合適的數(shù)據(jù)表示方法。這一部分的教學(xué)內(nèi)容主要是介紹基本的數(shù)據(jù)表示方法及各自的優(yōu)缺點(diǎn),尤其注重學(xué)生對各種表示方法的理解。
3.2 尋址方式問題
計(jì)算機(jī)的工作由程序驅(qū)動,而概括地說,程序又是加工處理數(shù)據(jù)的。不管是程序加丁.處理的數(shù)據(jù),還是程序本身,在程序執(zhí)行時(shí)都要存放到仔儲器巾。
程序在執(zhí)行過程中,需要不斷地從存儲器中取指令和數(shù)據(jù),往存儲器中存數(shù)據(jù),這就面臨一個非常重要的問題——尋址。從應(yīng)用層面看,程序有結(jié)構(gòu)問題:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)等;而數(shù)據(jù)也有結(jié)構(gòu)問題:一維結(jié)構(gòu)、二維結(jié)構(gòu)、三維結(jié)構(gòu)等。不同的程序結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)對尋址方式的要求不一樣,為了滿足這種差異性,系統(tǒng)必須提供多種不同的尋址方式。
以Inte18086為例,立即尋址主要用來處理常量,其他尋址方式則主要用來訪問變量,包括寄存器尋址、直接尋址、寄存器間接尋址、相對寄存器尋址、基址變址和相對基址變址等 。在訪問變量的各種尋址方式中,寄存器尋址主要用來訪問寄存器變量,而其他尋址方式則主要用來訪問內(nèi)存變量。在訪問內(nèi)存變量的各種尋址方式巾,直接尋址方式主要用在順序結(jié)構(gòu)巾,而其他尋址方式則主要用在循環(huán)結(jié)構(gòu)中。在用于循環(huán)結(jié)構(gòu)的尋址方式中,寄存器間接尋址和相對寄存器尋址主要用于一維數(shù)據(jù)結(jié)構(gòu),而基址變址和相對基址變址則主要用于二維數(shù)據(jù)結(jié)構(gòu)。
這一部分的教學(xué)內(nèi)容主要是存取數(shù)據(jù)和指令所需要的各種尋址方式,重點(diǎn)是各尋址方式的表達(dá)形式、構(gòu)成成分及各成分的作用。
3.3 指令系統(tǒng)問題
程序主要是加工處理數(shù)據(jù)的,同時(shí)程序主要由指令構(gòu)成,因此指令的主要功能也是圍繞加工處理數(shù)據(jù)展開。
一般而言,一條完整的指令主要圍繞4個問題展開:①什么地方或什么樣的數(shù);②與什么地方或什么樣的數(shù);③做什么樣的運(yùn)算;④結(jié)果放到什么地方。什么樣的數(shù)即常數(shù)(常量),既可以是數(shù)值常數(shù),又可以是符號常數(shù)。什么地方的數(shù)即變數(shù)(變量),既可以是寄存器數(shù),義可以是內(nèi)存數(shù)。上述4個問題中,①②④由指令巾的操作數(shù)(常數(shù))或地址碼(變數(shù))表達(dá),而③則由指令中的操作碼表達(dá) 。
這一部分的教學(xué)內(nèi)容主要是介紹一些最常用、最基本的指令,重點(diǎn)是各指令的功能、格式和用法,
3.4 流程控制問題
流程控制是所有程序都不可回避的問題。匯編語言程序的流程控制主要包括分支控制、循環(huán)控制、中斷調(diào)用、子程序調(diào)用。由于程序總是試圖順序執(zhí)行,因此順序結(jié)構(gòu)的流程控制不需要特別關(guān)心。實(shí)際上,這個問題已經(jīng)由系統(tǒng)解決。
不管哪種類型的流程控制,它們都是通過執(zhí)行相應(yīng)的流程控制指令,讓原本順序執(zhí)行的流程轉(zhuǎn)移到某個目標(biāo)位置來實(shí)現(xiàn),因此流程控制的一個核心問題就是如何在流程控制指令中正確地提供目標(biāo)地址 。此時(shí)的目標(biāo)地址就是一個廣義的數(shù)據(jù),因此數(shù)據(jù)的尋址方式也可以用在指令尋址中。
這一部分的教學(xué)內(nèi)容主要是各種類型流程控制所需要用到的基本指令,重點(diǎn)是各指令的功能、格式及其用法,尤其是如何利用轉(zhuǎn)移指令實(shí)現(xiàn)分支和循環(huán)。
3.5 參數(shù)傳遞問題
按模塊化程序設(shè)計(jì)思想,一個規(guī)模較大、功能較復(fù)雜的程序通常由一個主程序和若干個子程序構(gòu)成,它們之間形成調(diào)用和被調(diào)用的關(guān)系。主程序在通過調(diào)用子程序?yàn)樽约航鉀Q某些問題時(shí),通常需要為子程序提供一些相關(guān)的數(shù)據(jù),子程序在內(nèi)部對這些數(shù)據(jù)做相應(yīng)的加工處理后再將處理結(jié)果返回給主程序,這就是所謂的參數(shù)傳遞問題。主程序提供給子程序的數(shù)據(jù)通常叫做人口參數(shù),而子程序返回給主程序的數(shù)據(jù)則通常叫做出口參數(shù)。
需要做參數(shù)傳遞時(shí),通常有兩種選擇:一種方法是直接傳遞所需要的數(shù)據(jù),另一種方法是傳遞所需數(shù)據(jù)的位置信息即地址。第一種方法即通常所說的值傳遞,第二種方法即通常所說的地址傳遞。需要注意的是,傳地址的目的也是為了傳數(shù)據(jù)。在具體實(shí)現(xiàn)時(shí),不管哪種做法即不管是值傳遞還是地址傳遞,都需要事先約定好一個地方,這是它們的共同點(diǎn);不同點(diǎn)在于值傳遞是將所需要的數(shù)據(jù)本身放在這個事先約定好的地方,而地址傳遞是將所需要數(shù)據(jù)的位置信息即地址放在這個事先約定好的地方。約定地方時(shí)既可以約定寄存器,又可以約定內(nèi)存單元,還可以約定堆棧,因此具體的參數(shù)傳遞方式靈活多樣,而且各有各的優(yōu)勢,在實(shí)際應(yīng)用中通常綜合以上各種做法以求達(dá)到較好的效果。
一般來說,當(dāng)參數(shù)比較少時(shí),值傳遞比較合適;而當(dāng)參數(shù)比較多時(shí),地址傳遞比較合適。約定寄存器只適合于少量參數(shù)的傳遞,而約定內(nèi)存則沒有此限制。參數(shù)交換示意圖如圖1所示。
根據(jù)需要,一個子程序可以調(diào)用另一個子程序,也可以調(diào)用自己本身,這種情況就是所謂的遞歸調(diào)用,此時(shí)的子程序通常叫做遞歸子程序。凡是能夠用遞推關(guān)系描述的問題,都可以通過遞歸方法求解。
遞歸子程序的執(zhí)行過程可以分成兩個階段:回溯和返回?;厮菥褪菍訉舆f歸,將未知的、比較復(fù)雜的求解問題逐漸轉(zhuǎn)化成已知的、比較簡單的求解問題。在回溯的過程中,一旦層層遞歸到簡單問題的求解,就不再繼續(xù)遞歸,而是直接解出這個比較簡單的問題,然后進(jìn)入返回階段?;厮菔且粋€層層遞歸的過程,因此返回也是一層一層進(jìn)行。寫遞歸子程序的重點(diǎn)和難點(diǎn)在于回溯數(shù)據(jù)在保存和返回時(shí)的使用。
這一部分的教學(xué)內(nèi)容主要是參數(shù)傳遞的各種方法及其優(yōu)缺點(diǎn)。
4 方法與評價(jià)問題
如前所述,匯編語言和高級語言雖然是不同的程序設(shè)計(jì)語言,但是它們都是程序設(shè)計(jì)的工具,而程序設(shè)計(jì)的基本思想和方法不受程序設(shè)計(jì)語言的限制。匯編語言程序設(shè)計(jì)開沒在高級語言程序設(shè)計(jì)之后,因此教師在教學(xué)中應(yīng)充分利用它們兩者之間的聯(lián)系與差別組織教學(xué),充分利用學(xué)習(xí)遷移規(guī)律減輕學(xué)生的學(xué)習(xí)負(fù)擔(dān),同時(shí)提高學(xué)習(xí)效率,加深理解。
在教學(xué)過程中,教師可以圍繞兩個基本點(diǎn)進(jìn)行匯編語言和高級語言的比較教學(xué):一是圍繞程序的功能(數(shù)據(jù)安排、數(shù)據(jù)輸入、數(shù)據(jù)運(yùn)算、數(shù)據(jù)輸出),介紹匯編語言為了實(shí)現(xiàn)這些功能而提供的相應(yīng)處理機(jī)制;二是圍繞程序的結(jié)構(gòu)(順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、子程序結(jié)構(gòu)),介紹匯編語言為了實(shí)現(xiàn)這些結(jié)構(gòu)而提供的相應(yīng)處理機(jī)制。由于學(xué)生已經(jīng)有了在高級語言程序設(shè)計(jì)課程中習(xí)得的各種編程經(jīng)驗(yàn),因此教師在進(jìn)行匯編語言程序設(shè)計(jì)教學(xué)時(shí),不管講授什么內(nèi)容,都要注意和高級語言作比較,利用高級語言提高教學(xué)效率。
關(guān)于教學(xué)效果的評價(jià),根據(jù)自身多年的教學(xué)實(shí)踐經(jīng)驗(yàn),筆者認(rèn)為采用開卷考試或者撰寫課程論文的方式比較適合。如果選擇開卷考試,可以以主觀題為主甚至全部采用主觀題;如果選擇課程論文,則可以對匯編語言和高級語言進(jìn)行對比研究。值得強(qiáng)調(diào)的是,評價(jià)方式要靈活多樣,具體依教學(xué)要求和評價(jià)目標(biāo)而定。
5 結(jié)語
雖然匯編語言在應(yīng)用開發(fā)尤其是純軟件的應(yīng)用開發(fā)方面并不具有優(yōu)勢,但是在教育教學(xué)上卻有著不可忽視的作用。在計(jì)算機(jī)專業(yè)幾門核心課程的教學(xué)中,教師就可以充分利用匯編語言提高教學(xué)效果,在組成原理的教學(xué)中利用匯編指令講述指令系統(tǒng),在接口技術(shù)的教學(xué)中利用匯編語言編寫相應(yīng)的硬件驅(qū)動程序,在編譯技術(shù)的教學(xué)中利用匯編語言作為編譯的中間碼講述編譯優(yōu)化,不僅可以簡化問題、提高效率,而且更方便學(xué)生理解和接受。