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