時間:2023-05-30 09:27:09
開篇:寫作不僅是一種記錄,更是一種創(chuàng)造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇匯編程序,希望這些內(nèi)容能成為您創(chuàng)作過程中的良師益友,陪伴您不斷探索和進步。
一、序言
近年來,隨著C語言的進一步推廣使用,絕大多數(shù)的工程師都傾向于使用C語言進行單片機系統(tǒng)開發(fā),匯編語言由于可讀性、通用性、可移植性差的原因,很難滿足產(chǎn)品開發(fā)的需求。但是匯編語言具有執(zhí)行效率高、占用內(nèi)存空間小等特點,在某些應(yīng)用領(lǐng)域還是具有無可替代的作用。
本文結(jié)合Keil μVision2程序開發(fā)流程,描述了51單片機匯編程序多文件編譯的實現(xiàn)方法。通過多文件編譯的使用,大大提高了匯編程序代碼的可讀性、可擴展性,同時也很大程度地提高程序代碼的執(zhí)行效率以及內(nèi)存空間的使用率,避免內(nèi)存空間的浪費。
二、Keil μVision2程序開發(fā)流程簡介
Keil μVision2是美國Keil Software公司出品的51系列兼容單片機軟件集成開發(fā)環(huán)境,該軟件提供宏匯編器、鏈接/定位器、庫管理器、調(diào)試器以及目標(biāo)文件轉(zhuǎn)換器等工具,是51單片機系統(tǒng)開發(fā)的首選工具。
Keil μVision2集成開發(fā)環(huán)境的編譯流程如下:首先宏匯編器對匯編源程序文件進行編譯,生成擴展名為.OBJ的目標(biāo)文件和擴展名為.LST的列表文件,緊接著鏈接/定位器將所有的.OBJ文件進行絕對地址分配,鏈接生成包含絕對地址的目標(biāo)文件和擴展名為.M51的地址文件,最后由目標(biāo)文件轉(zhuǎn)換器生成可用于編程器燒寫、擴展名為.HEX的可執(zhí)行文件。
三、匯編程序多文件編譯實現(xiàn)
在Keil μVision2集成開發(fā)環(huán)境下,我們可以根據(jù)不同的硬件模塊、功能模塊分開編寫應(yīng)用子程序,進行模塊化管理,實現(xiàn)多文件編譯,這樣就可以大大提高匯編程序代碼的可讀性、可擴展性。以下首先對段和模塊的概念進行描述。
一個段可以是一塊程序代碼或者是一個數(shù)據(jù)塊。根據(jù)其地址空間是否可以被鏈接/定位器更改,段可以分為可定位段和絕對地址段。在定義可重定位段的時候需要對其段名、類型及其屬性進行定義。一個段可以分在不同的程序模塊中,只要具有相同的段名,在編譯過程中鏈接/定位器會把它們合并到一起。在定義絕對地址段的時候直接人為分配絕對地址,鏈接/定位器不能對改地址進行更改。絕對地址段沒有段名,也不能給其他段結(jié)合。
模塊是一個可以被單獨編譯的代碼單元,可以包含一個或多個段或者部分段,一個模塊既可以是單個文本文件,也可以通過INCLUDE指令把幾個文本文件合并在一起。在程序編譯過程中,匯編器會把一個模塊編譯為一個目標(biāo)文件,也就是一個模塊對應(yīng)一個.OBJ文件。
根據(jù)以上對段和模塊的描述,匯編程序的多文件編譯可以通過以下三個方法來實現(xiàn):
1、通過INCLUDE指令合并源文件
在代碼編寫時,通過INCLUDE指令可以將一個源文件插入到當(dāng)前源文件中,這樣匯編器在編譯的時候就會將INCLUDE指令之后的文件合并到當(dāng)前文件進行編譯,生成一個擴展名為.OBJ的目標(biāo)文件。INCLUDE指令的格式如下:
$ INCLUDE (文件名)
通過該方式實現(xiàn)多文件編譯時,插入的源文件既可以是擴展名為.ASM的匯編源程序文件,也可以是擴展名為.INC的包含文件。注意在被包含的源文件結(jié)尾不能有END指令,否則編譯會停止運行。
2、通過絕對地址段實現(xiàn)多文件編譯
Keil μVision2中提供以下定義絕對地址段的指令,通過這些指令可以定義代碼段和各種數(shù)據(jù)段,并指定其絕對地址。
由于絕對地址段在定義的時候?qū)Φ刂愤M行了分配,鏈接/定位器不能夠?qū)ζ涞刂愤M行更改,因此很容易造成地址重疊或者內(nèi)存空間浪費,而且在后續(xù)對程序進行維護、升級的時候很有可能需要重新對地址進行分配,非常不利于程序的擴展和維護。因此絕對地址段通常是用在某些特定的場合,例如確定中斷向量的入口地址、數(shù)據(jù)存儲空間等。
3、通過可重定位段實現(xiàn)多文件編譯
在Keil μVision2中,通過SEGMENT指令即可定義可重定位段。定義可重定位段時必須指定段的名稱和存儲類型,其格式如下:
四、總結(jié)
通過以上三種方式,均可以實現(xiàn)多文件編譯,但是在實際使用過程中,INCLUDE指令通常用于包含特殊功能寄存器的定義等;絕對地址段則通常用于確定中斷向量的入口地址、數(shù)據(jù)存儲空間;而可重定位段的方式則廣泛地用于各種代碼段或數(shù)據(jù)段的定義。
通過多文件編譯的方式,解決了單文件編譯會導(dǎo)致程序文件過于臃腫、可讀性差、不便于維護等缺點,大大提高匯編程序代碼的可讀性以及可維護性。
參考文獻
[1] Keil Software. A51/AX51/A251 Macro Assembler and Utilities.2001.
一、C語言與匯編語言的混合編程方法分析
混合編程方法包括C語言調(diào)用匯編語言子程序、匯編語言調(diào)用C語言子程序和C語言程序嵌入?yún)R編語言三種。第一,C語言調(diào)用匯編語言子程序需要遵循以下規(guī)則。一是根據(jù)參數(shù)順序,依據(jù)反序順序?qū)?shù)壓入堆棧中。二是依據(jù)參數(shù)的值進行傳遞;三是使用“EXTERN”對函數(shù)顯示進行說明,函數(shù)名使用下劃線格式的8個字符以內(nèi)的名字命名;四是對代碼段加以說明,并使用“—TEXT”作為代碼段命名原則。五是匯編程序的參數(shù)取C程序的參數(shù);六是匯編程序需要兼顧保護寄存器。基于以上6個原則,C語言與匯編語言混合編程時,匯編過程需要遵守規(guī)定的開頭及結(jié)尾格式。第二,匯編語言調(diào)用C語言子程序則不需要改變匯編語言主程序和子程序的格式,只需主程序和子程序的格式保持一致,再開始前使用“EXTREN函數(shù)名”用于表明身份,表示該函屬于調(diào)用C語言子程序的外部函數(shù)。第三,C語言程序嵌入?yún)R編語言包括兩種:一是C程序調(diào)用匯編子程序模塊和C程序嵌入?yún)R編指令兩種。C程序調(diào)用會匯編子程序模塊需根據(jù)主程序和模塊編寫語言確定,如果主程序為C語言、模塊為匯編語言,則需要使用C程序調(diào)用匯編子模塊。C程序嵌入?yún)R編指令主要用于處理C語言無法控制硬件的情況。例如修改中斷標(biāo)志寄存器、重復(fù)使用某種功能可采用C語言嵌入?yún)R編指令的方式實現(xiàn)。
二、C語言與匯編語言連接的關(guān)鍵問題要實現(xiàn)
C語言與匯編語言之間的連接還需要解決參數(shù)關(guān)系、確定調(diào)用關(guān)系和模塊連接三個問題。參數(shù)關(guān)系是混合編程過程中必須解決的問題,多數(shù)程序員均采用堆棧方式解決參數(shù)傳遞問題,具體操作為:以匯編語言中的BP作為機制寄存器,以反序多為調(diào)用順序,將C語言中的參數(shù)壓入堆棧中,且BP根據(jù)參數(shù)加入相應(yīng)的偏移量即可實現(xiàn)參數(shù)使用。而確定調(diào)用關(guān)系則需要說明要調(diào)用的函數(shù)或過程,并確定調(diào)用及其調(diào)用關(guān)系。外部模型可調(diào)用被調(diào)用的函數(shù)或被調(diào)用過程,調(diào)用程序需說明被引用的外部模塊的名稱。實現(xiàn)匯編程序與C程序模塊連接需要保證不同語言模塊的存儲模式相同以及遵守C兼容的函數(shù)及變量命名約定。
三、結(jié)語
隨著計算機技術(shù)的提高及計算及應(yīng)用范圍擴大,許多領(lǐng)域的控制工作都得到極大的簡化,而且C語言這一高級程序設(shè)計語言的應(yīng)用也愈加廣泛,豐富了計算機軟件的功能及內(nèi)容。然而,信息技術(shù)始終處于不斷發(fā)展?fàn)顟B(tài),人們對計算機軟件編程的要求也在逐漸提高,程序員仍需要深入了解C語言的特性,強化C語言運用,利用C語言實現(xiàn)計算機軟件的多功能,不斷創(chuàng)新和開發(fā)信的軟件。最后,程序員還需要合理運用C語言和匯編語言進行綜合編程,簡化軟件編寫過程,提高軟件使用效率。
作者:芮素文單位:安徽國防科技職業(yè)學(xué)院
關(guān)鍵詞:匯編語言源程序;匯編;Debug 調(diào)試
匯編語言作為一種介于機器語言和高級語言之間的程序設(shè)計語言,有其獨有的特點和應(yīng)用場合。用匯編語言編寫的解決應(yīng)用問題的程序稱作匯編語言源程序;將匯編語言源程序翻譯成機器語言程序的軟件稱作匯編程序;將匯編語言源程序翻譯成機器語言程序的過程稱作匯編。匯編語言源程序上機運行需要MS-DOS操作系統(tǒng)的支持,也可運行在Windows 98以上的MS-DOS環(huán)境中。
二、匯編源程序
用編輯軟件建立的源程序.asm文件,必須經(jīng)過匯編才能產(chǎn)生.obj文件。
本步驟最需要注意的問題就是所用的masm匯編程序和編輯好的匯編語言源程序的路徑,只要不在默認目錄下的都要輸入他們的實際路徑,為此需鍵入:”e:\masm\masm 123”,因為匯編語言源程序123.asm已經(jīng)保存在默認目錄C:\Documents and Settings\Administrator下,就不用輸入詳細路徑,而匯編程序masm不在默認目錄下,故需要輸入該程序所在的詳細路徑e:\masm\masm,如下圖所示。
以上信息中方括中為該項提示的缺省回答值,冒號后面等待用戶輸入信息,若不改變?nèi)笔≈祫t直接按回車鍵。
匯編后生成以下幾個文件:
(1).OBJ文件是匯編產(chǎn)生的目標(biāo)代碼文件,當(dāng)源程序中無語法錯誤時,則在默認目錄下自動存入一個.OBJ文件,供下一步連接用。若源程序有語法錯誤時,會出現(xiàn)錯誤信息提示,如上圖所示。
(2).LST文件是列表文件,它將源程序中各語句及其對應(yīng)的目標(biāo)代碼和符號表以清單方式列出,對調(diào)試程序有幫助。
(3).CRF文件(交叉引用文件),交叉引用.CRF文件給出了源程序中定義的符號引用情況,按字母順序排列。
三、 連接目標(biāo)程序
匯編產(chǎn)生的.OBJ文件,組成該文件所有目標(biāo)代碼的地址都是浮動的,機器不能執(zhí)行。必須用連接程序LINK對其進行連接定位,產(chǎn)生.EXE可執(zhí)行文件,方可運行。該步驟和上一步有同樣需要注意的路徑問題,輸入連接程序LINK的實際路徑,需要連接的.OBJ文件在默認目錄下,可不用輸入路徑。
連接后生成兩種文件:.EXE和.MAP
(1).EXE文件是可執(zhí)行文件,若采用方括號中默認的名字,直接按回車鍵,否則需重新輸入一文件名。若連接過程中無錯誤,則自動在當(dāng)前默認目錄下生成.EXE文件。若有錯誤,則會給出錯誤信息提示,這時必須重新修改源程序,再匯編、連接。
(2).MAP是連接映像文件,.LIB庫文件,連接程序詢問是否使用某種庫文件,不需使用庫文件直接按回車鍵。
四、運行程序
連接后生成的.EXE文件存放在當(dāng)前的默認目錄下,在DOS環(huán)境下直接鍵入文件名即可運行。
結(jié)論
總體上說,要掌握匯編語言源程序上機運行的操作過程,還是應(yīng)該理解每一步驟的作用及原理,理解后就知道為什么要這樣操作,該注意哪些問題,發(fā)生錯誤該怎樣改正。因此匯編語言的學(xué)習(xí)不只是理解它全部的指令含義,還要理解它上機運行的原理。通過學(xué)習(xí)匯編語言,能夠加深對計算機原理和操作系統(tǒng)等課程的理解;能夠感知、體會和理解機器的邏輯功能,也為理解各種軟件系統(tǒng)的原理,打下技術(shù)理論基礎(chǔ)。
參考文獻
關(guān)鍵詞:匯編語言程序設(shè)計; 教學(xué)方法; 內(nèi)聯(lián)編程
1課程的現(xiàn)狀
匯編語言不同于其它高級語言,必須要求編程人員有一定的硬件基礎(chǔ),如對CPU的結(jié)構(gòu)、CPU與存儲器等部件的數(shù)據(jù)傳送過程必須要有基本的了解,這樣才能學(xué)好這門課程。在教學(xué)過程中,我們發(fā)現(xiàn)學(xué)生對高級語言編程學(xué)習(xí)積極性高,對匯編語言課程缺乏興趣,因為課程本身指令復(fù)雜,規(guī)定繁多,再加上學(xué)習(xí)匯編指令前對CPU的相關(guān)工作過程理解不透,導(dǎo)致學(xué)生厭學(xué),又由于本課程面對的低年級學(xué)生只有高級語言的基礎(chǔ),習(xí)慣于高級語言的自然表達,初次接觸計算機硬件知識心理上有恐懼感,更難以適應(yīng)繁雜的低級語言。
針對本課程的特點,對教學(xué)內(nèi)容、環(huán)節(jié)、過程等進行了精心設(shè)計,下面就教學(xué)方法的設(shè)計、實踐教學(xué)方法、課程考核形式等方面進行的一系列改革進行詳細探討。
2教學(xué)方法設(shè)計改革
為了避免學(xué)生因指令復(fù)雜,規(guī)定繁多、難度大而對該課程產(chǎn)生畏懼的學(xué)習(xí)心理,教師有必要對教學(xué)內(nèi)容進行合理組織,對教學(xué)過程進行精心的設(shè)計。
2.1利用FLASH技術(shù),使教學(xué)難點容易理解
在多年的教學(xué)過程中,我發(fā)現(xiàn)學(xué)生在學(xué)習(xí)CPU結(jié)構(gòu)這章節(jié)中,對介紹的CPU由哪些寄存器(名稱、大小)構(gòu)成,各個寄存器的含義,用途,CPU與存儲器等部件的數(shù)據(jù)傳送過程,會覺得很抽象,多數(shù)同學(xué)都是采用死記硬背的方式,這章節(jié)是第二章節(jié)的內(nèi)容,也是能否學(xué)好該課程關(guān)鍵的一章,如果理解不深,這無疑為后續(xù)的學(xué)習(xí),特別是尋址方式的學(xué)習(xí)埋下了隱患。
針對這個問題,教師有必要對教學(xué)過程進行精心的設(shè)計。
在這章節(jié)中我們利用FLASH技術(shù),把各種尋址方式下傳送指令的CPU與存儲器等部件的數(shù)據(jù)傳送過程以動畫形式展現(xiàn)給學(xué)生,使得復(fù)雜,抽象的過程變得直觀,學(xué)生理解比較容易,也加深了對尋址方式的記憶。
2.2對比法教學(xué)
目前計算機專業(yè)的課程設(shè)置中,《匯編程序語言的程序設(shè)計》課程通常是學(xué)習(xí)完C語言課程之后開始學(xué)習(xí)的。所以在教學(xué)中可以采用對比法來講解課程,對某些語法知識點和程序設(shè)計過程我們可以以C語言和匯編語言對應(yīng)分析。
例如在介紹寄存器時,由于在一般的c語言程序中并沒有直接使用到寄存器。因此,我們使用vC++6.0環(huán)境下的調(diào)試工具顯示一個c語言程序及其對應(yīng)的機器碼,讓學(xué)生看到編寫匯編程序寄存器的用途,加深了學(xué)生對匯編語言程序的理解。
int m=5,n=6,c;
004010E8 mov dword ptr [ebp-4],5
004010EF mov dword ptr [ebp-8],6
c=m+n;
004010F6 mov eax,dword ptr [ebp-4]
004010F9 add eax,dword ptr [ebp-8]
004010FC mov dword ptr [ebp-0Ch],eax
在介紹語法知識時,比如變量的定義:
C語言中的變量定義形式如下:
int c1,c2=0;
匯編語言的變量定義形式如下:
cl DW ?
c2 DW 0 轉(zhuǎn)貼于
2.3抽象概念的比喻教學(xué)法
在對段地址和偏移地址的講解過程中,可以采用比喻法,把操作數(shù)比喻成學(xué)生,把教室的房間號比喻成段地址,教室內(nèi)每個座位編個號,編號就是偏移地址,要想到教室把某個學(xué)生找到,就要找到相應(yīng)的教室號,再到對應(yīng)的座位號找到這個學(xué)生,同理,要想把主存中的操作數(shù)找到就要找到段地址和相應(yīng)的偏移地址,另外要讓學(xué)生知道每個教室里的座位號都是從0號開始編號的,也就是每個段里的偏移地址如果不特別指定,也是從0號開始編號的。
3實踐教學(xué)改革
3.1增強實驗環(huán)節(jié),做一些實際項目
程序設(shè)計對于大多數(shù)的初學(xué)者來說有一定的難度。對于給定的一個實驗題目,許多學(xué)生往往感到無從下手。目前的上機實驗時間往往很短,常常是學(xué)生才剛剛有點入門,實驗環(huán)節(jié)就結(jié)束了;且課外實踐環(huán)節(jié)幾乎沒有,導(dǎo)致學(xué)生即使課內(nèi)學(xué)的再好也不會應(yīng)用。
在實驗設(shè)計方面可以先把一些經(jīng)典的程序提供給學(xué)生,例如分支結(jié)構(gòu)的設(shè)計、循環(huán)結(jié)構(gòu)的設(shè)計等,讓學(xué)生在寫出C語言程序之后再設(shè)計匯編程序,找出兩者編程思維的區(qū)別。這樣通過一段時間的經(jīng)驗積累,就能夠編寫比較復(fù)雜的的程序,由于上機時間有限,可以每次實驗課之后布置一些題目供學(xué)生選擇思考,讓學(xué)生課外分組來設(shè)計這些程序,題目的類型可以是研討型的讓學(xué)生從更多的角度去思考上機實驗過的題目,編寫出不同的程序;另一種為編程型,
例如可以設(shè)置這2道題目,音樂小鍵盤、貪吃蛇游戲等,以加強同學(xué)們的編程能力的訓(xùn)練。
3.2采用與高級語言混合編程
目前越來越多的場合要使用匯編語言和高級語言進行混合編程,因此在教學(xué)時應(yīng)強調(diào)匯編語言和C/C++的混合編程,并且這樣也可以為今后嵌入式系統(tǒng)軟件開發(fā)的學(xué)習(xí)打下堅實的軟硬件基礎(chǔ)。
在實驗課中可以借助 Visual C++開發(fā)工具,采用內(nèi)聯(lián)匯編的方式,在 C/C++源程序中嵌入?yún)R編指令序列完成一定的功能,并讓學(xué)生設(shè)置斷點然后跟蹤執(zhí)行,同時注意觀察寄存器的內(nèi)容和變量的值。這樣可以一方面讓同學(xué)們熟練掌握兩種語言的切換使用,另一方面讓他們感受到兩種語言各有特點。例如可以利用匯編語言處理高級語言中不方便處理的一些問題。
4課程考核形式改革
因為“匯編語言程序設(shè)計”是實踐性很強的一門課程,所以實驗課成績應(yīng)該在總成績中占有相當(dāng)大的比重。目前大多數(shù)高校的匯編語言課程的實驗課成績只占很小的比重,即理論知識往往占課程期末考核總成績的70%~80%,這樣往往會導(dǎo)致學(xué)生不得不將大量的精力放在理論知識的學(xué)習(xí)中,結(jié)果只會造就大批的應(yīng)試高手。在教學(xué)中,我們遇到過有的學(xué)生考試試卷能考90分以上,卻連最基本的計算機操作都不能動手。今后這門課程的考核,實驗課成績應(yīng)該提高到占總成績的1/2。老師在實驗中應(yīng)該營造出互動氣氛,檢查每個學(xué)生的完成情況同時做好記錄,根據(jù)學(xué)生的實際動手情況給出他們的平時實驗成績,而不是只依據(jù)交上來的實驗報告,這樣也能杜絕抄襲之風(fēng)。
5結(jié)束語
通過教學(xué)改革的實踐,在一定程度上提高了他們對本課程的學(xué)習(xí)積極性,又降低了學(xué)習(xí)難度。良好的教學(xué)效果是永遠追求的目標(biāo),在今后的教學(xué)中,我們還需要不斷進行探索、研究和嘗試,不斷更新觀念,發(fā)現(xiàn)自身教學(xué)過程中的問題,找到解決辦法,提高教學(xué)效果。
參考文獻
[1] 王成耀.80x86匯編語言程序設(shè)計[M].北京:人民郵電出版社,2008(第2版).
[2] 卜登立,彭嵩松,唐衛(wèi)東,龍侃.“匯編語言程序設(shè)計”課程教學(xué)改革研究與探討[J].井岡山學(xué)院學(xué)報,2009,30(10):124-127.
【關(guān)鍵詞】FORTH 匯編語言 中斷程序
1 引言
匯編語言是人和計算機溝通的最直接的方式,它描述了機器最終所要執(zhí)行的指令序列,所以匯編語言一直是計算機學(xué)科必學(xué)的一門基礎(chǔ)課程。通過這門課的學(xué)習(xí)既能獲得底層編程的體驗,又能深刻理解機器運行程序的機理。FORTH是一種與眾不同的計算機程序設(shè)計語言,采用自底向上的構(gòu)造方式,用匯編語言編寫核心單詞,實現(xiàn)內(nèi)部數(shù)據(jù)結(jié)構(gòu)和解釋/編譯機制,構(gòu)造最小的系統(tǒng),然后將該系統(tǒng)運行在宿主機上,進而編譯的其它高層單詞,形成一個完整的系統(tǒng)。
本文是在研究了FORTH的自生成技術(shù)的基礎(chǔ)上,自定義了一套匯編語言語法,并且構(gòu)造出將自定義匯編語言轉(zhuǎn)換為CPU機器碼的編譯器,講解了自定義匯編語言的基本使用方法,最后以中斷程序為例,介紹了自定義FORTH匯編程序的實現(xiàn)方式。
2 FORTH匯編語言和編譯器的實現(xiàn)方法
基本的FORTH平臺內(nèi)不含產(chǎn)生機器碼的匯編語言編譯器,只是將一個用FORTH語言寫的匯編語言編譯器的源代碼作為附件。一般我們可以使用這個編譯器,但也可以自己按照自己的習(xí)慣構(gòu)造自己的語法和編譯器。
實現(xiàn)編譯器,首先要制訂語言規(guī)范。由于FORTH匯編語言并沒有權(quán)威的規(guī)范,甚至有些要開發(fā)的目標(biāo)芯片就還沒有匯編語言標(biāo)準(zhǔn)可以借鑒,因此程序開發(fā)者完全可以編寫自己的編譯器和創(chuàng)造自己的規(guī)范。FORTH匯編語言的語法規(guī)范是模仿常用的匯編語言,只是將表達式寫成“逆波蘭”形式,即將操作符寫在操作數(shù)后面。以8086匯編為例,將AX減去BX的內(nèi)容,結(jié)果在AX中,標(biāo)準(zhǔn)的匯編語言為:SUB AX, BX ,在FORTH匯編語言規(guī)范中可以模仿標(biāo)準(zhǔn)的匯編語言規(guī)定為:AX, BX SUB,也可以采用這種寫法:BX AX SUB,,不僅逗號移到了操作數(shù)那里,而且目的操作數(shù)也移到了右面。雖然FORTH匯編語言規(guī)范存在這種任意性,但如果存在標(biāo)準(zhǔn)的匯編語言,除了將操作符寫在右面,還是盡量保持標(biāo)準(zhǔn)的風(fēng)格,這樣容易和別人交流。
實現(xiàn)FORTH匯編編譯器,主要利用FORTH字“C,”、“,”和“Here”,它們分別是向程序區(qū)依次放一個字節(jié)的二進制指令、兩個字節(jié)的二進制指令和給出存放下一個指令的地址。
以8086為例,無操作數(shù)的中斷返回指令I(lǐng)RET,可以這樣實現(xiàn):
語法: IRET
實現(xiàn): : IRET CF C, ; //將IRET的機器碼CF一個字節(jié)放到當(dāng)前的指令流中
單操作數(shù)的跳轉(zhuǎn)指令JMP,可以這樣實現(xiàn):
語法: LLLL JMP //LLLL定義了轉(zhuǎn)跳的地址
實現(xiàn): : JMP E8 C, ,;
同樣上面實現(xiàn)的FORTH含義是將JPM的機器碼E8一個字節(jié)放到當(dāng)前的指令流中,然后再把已經(jīng)在堆棧中的要跳轉(zhuǎn)的地址作為16位偏移放到機器碼E8之后,形成完整的跳轉(zhuǎn)指令。
通常每個FORTH軟件平臺都有這個平臺的匯編語言規(guī)范和編譯器,但是如果要生成異構(gòu)的FORTH系統(tǒng),重新制定新CPU的匯編語言規(guī)范和編譯器就是必須要完成的任務(wù)。
2.1目標(biāo)代碼的存取
由于一般FORTH目標(biāo)系統(tǒng)的核心規(guī)模較小,16位的系統(tǒng)不超過64KB,32位的系統(tǒng)也用不完內(nèi)存空間,因此可以直接在宿主機FORTH系統(tǒng)管理的內(nèi)存中劃出一塊高內(nèi)存區(qū)域用于目標(biāo)代碼的存取。假如P!和P@是原內(nèi)存的寫入和讀取字,目標(biāo)代碼區(qū)域的起點是C000,則目標(biāo)代碼的存取字可以簡單的定義為下面的算法:
C000 CONSTANT Origin
// 定義常數(shù) Origin,它的值是目標(biāo)代碼區(qū)域的起點
: ! Origin + P! ; : @ Origin + P@ ; // 定義目標(biāo)區(qū)的數(shù)據(jù)存取字
同樣也可以產(chǎn)生按字節(jié)的存取字C!和C@。
2.2 機器碼寫入
匯編語言所產(chǎn)生目標(biāo)機的機器碼是順序存放的,其中跳轉(zhuǎn)指令是代碼的當(dāng)前位置參考計算的,因此可以設(shè)置一個當(dāng)前代碼地址指針CP實現(xiàn):
Variable CP : Here CP @ ; // Here字給出下一個機器碼存放的地址
: C, Here C! CP @ 1+ CP ! ; // 放一個字節(jié)的機器碼到目標(biāo)區(qū)
: , Here ! CP @ 2+ CP ! ; // 放一個16位字的機器碼到目標(biāo)區(qū)
有了這些FORTH字,可以不用助記符和匯編,直接把二進制代碼一個字節(jié)一個字節(jié)地生成目標(biāo)碼。
2.3 向前跳轉(zhuǎn)地址
關(guān)鍵詞:匯編語言程序設(shè)計;教學(xué)改進
中圖分類號:TP311文獻標(biāo)識碼:A文章編號:1009-3044(2011)09-2111-02
Teaching Thinking of Assembly Language Programming Course
LUO Xing
(Hanshan Normal University, Hanshan 521041, China)
Abstract: This paper discusses the problem appear in teaching of assembly language programming course, propose some methods to improve student's ability to master the knowledge and learning interest. Discuss the assembly language teaching in Win32 platfrom in the last.
Key words: assembly language programming; teaching improvement
1 匯編語言程序設(shè)計課程教學(xué)現(xiàn)狀
匯編語言程序設(shè)計作為一門計算機專業(yè)的課程,其存在的合理性在近年受到爭議。有些人認為,匯編語言作為一種低級語言,指令繁多,難以掌握。另外,編程效率也不高,一個高級語言用一條語句實現(xiàn)的功能,在匯編語言中需要很多條指令才能實現(xiàn)。此外,匯編語言在時間上和空間上的優(yōu)勢由于高速CPU和大容量存儲器的出現(xiàn),也變得意義不大。
我認為學(xué)習(xí)匯編語言仍然具有重要意義。可以歸納如下:
1) 可以比較深入了解計算機硬件的底層工作原理,例如:CPU的工作模式,寄存器的概念,內(nèi)存的尋址方式,中斷的工作原理等。
2) 熟悉各種數(shù)據(jù)表示方法。如各種數(shù)制的轉(zhuǎn)化,各種類型的數(shù)據(jù)在內(nèi)存中的存儲方式。學(xué)生在系統(tǒng)學(xué)習(xí)匯編語言程序設(shè)計這門課程后,對二進制,十進制以及十六進制相互間的轉(zhuǎn)換應(yīng)該非常熟練。對數(shù)據(jù)在內(nèi)存中兩種排列方式即大端方式(Big Endian,低地址存放高位字節(jié))與小端方式(Little Endian,低地址存放低位字節(jié))有清晰的理解。而這些相關(guān)的概念的牢固掌握對高級語言中的數(shù)據(jù)類型以及計算機網(wǎng)絡(luò)編程的學(xué)習(xí)具有很大的幫助。
3) 通過匯編語言編程學(xué)習(xí),可以促進對高級編程語言相關(guān)概念的理解。高級語言在編譯的時候,一般都是先生成匯編代碼,然后再生成的二進制代碼。所以,通過對比分析匯編代碼與高級語言代碼的實現(xiàn)方式,對程序的執(zhí)行效率,數(shù)據(jù)在內(nèi)存中存放方式,堆棧的概念,函數(shù)的調(diào)用及參數(shù)傳遞的方式等都會有進一步的了解。
在教學(xué)中,我也遇到一些問題。一方面就是學(xué)生的積極性不高。主要原因包括:指令很多,難以記憶。對于幾個大類的指令,如果每次課上一類,學(xué)生課后如果不進行主動復(fù)習(xí),往往到下一次課的時候,就會忘記前面所學(xué)的內(nèi)容或者發(fā)生混淆。另外,在學(xué)習(xí)匯編課程之前,他們已經(jīng)學(xué)過一門高級語言,如C/C++等,匯編語言的學(xué)習(xí)方式與高級語言的學(xué)習(xí)方式有所不同,高級語言比較容易上機練習(xí),也容易對程序運行結(jié)果驗證,對于開發(fā)實用軟件也相對容易,所以學(xué)生的興趣比較大。而匯編語言一方面涉及到底層的硬件概念,比較難以理解,另一方面上機也比較困難,可以這么說,如果按照課本的順序講課,要到差不多講完課,學(xué)生才可以上機完成一個功能比較完整的程序。
2 促進學(xué)生對知識的掌握
要解決這些問題,我認為要在學(xué)生的知識掌握方式以及學(xué)習(xí)興趣的培養(yǎng)上下功夫。對于知識的掌握,除了每次新課內(nèi)容講完后,精心給學(xué)生布置作業(yè)習(xí)題之外。還應(yīng)該注意到由于匯編語言的指令及相關(guān)的知識點很多,對于剛接觸這門課程的學(xué)生一開始往往不大適應(yīng),容易混淆前面學(xué)過的內(nèi)容,所以教師及時對所學(xué)過知識點進行比較和總結(jié)就很有必要。此外還應(yīng)該定期對學(xué)生的學(xué)習(xí)效果進行檢測,從過去的教學(xué)經(jīng)驗看,匯編語言這門課程是學(xué)生比較容易與教師的教學(xué)進度脫離的一門課程,不少學(xué)生在一開始由于在掌握知識遇到困難,問題越積越多,最終可能放棄聽課。在檢測的方法上,可以借助網(wǎng)上考試系統(tǒng)。教師可以自主出題,也可以讓系統(tǒng)自動出題。通過分析學(xué)生的測試結(jié)果,教師可以及時調(diào)整教學(xué)進度,學(xué)生也會有一定的學(xué)習(xí)壓力,使他們花更多時間查補缺漏的知識。
程序設(shè)計學(xué)習(xí)的最佳方法就是上機實踐。匯編語言上機練習(xí)跟高級語言的上機練習(xí)相比,對于學(xué)生來說比較困難。一方面是由于一個完整的匯編程序涉及的知識點很多,而教材往往按知識點分類進行編排。所以學(xué)生要想在剛開始學(xué)習(xí)階段,就編出完整的程序有一定的難度。另一方面,匯編程序的運行結(jié)果較難在屏幕上輸出,匯編語言只有字符與字符串的輸入輸出,對于一道簡單的算術(shù)運算題目,其結(jié)果的輸出都要通過一大段的轉(zhuǎn)換程序來實現(xiàn)。對于第一個問題,教師可以對教材內(nèi)容進行選講,把實驗所涉及到的知識點先進行講解。對于第二個問題, 我認為應(yīng)該重點培養(yǎng)學(xué)生熟練使用調(diào)試工具的能力,通過掌握調(diào)試工具如DEBUG,CV等的使用,一方面學(xué)生可以直接觀察程序的運行結(jié)果,另一方面,對于程序的邏輯錯誤也可以進行跟蹤、分析以及解決。此外,由于匯編語言作為一種低級語言,編程都由一條條指令進行構(gòu)造,所以相對繁瑣,應(yīng)盡早讓學(xué)生應(yīng)用模塊化思路,掌握子程序及宏的使用方法。這樣把一些常用功能做成模塊,如輸入輸出功能,以后學(xué)生在編程的時候就可以直接調(diào)用這些模塊,從而專注于實驗的其它方面。
3 提高學(xué)生的學(xué)習(xí)積極性
對于如何提高學(xué)生的學(xué)習(xí)興趣,我認為主要讓學(xué)生意識到匯編語言的作用。一方面可以引入一些接口技術(shù)相關(guān)內(nèi)容,使學(xué)生熟練掌握中斷的概念以及I/O指令,然后上機編寫中斷程序,在中斷控制器(8259A)進行驗證,由于這些實驗有按鍵輸入,有屏幕輸出,還能直接看到程序控制設(shè)備的效果,所以學(xué)生興趣會比較大。此外,教師也可以適當(dāng)拓展一些知識,如嵌入式編程相關(guān)概念,有興趣的同學(xué)可以在課后自主進行學(xué)習(xí)。另外,由于不少學(xué)生對硬盤相關(guān)的問題感興趣,比如硬盤數(shù)據(jù)的存放方式,數(shù)據(jù)的修復(fù)等。可以引導(dǎo)學(xué)生對這些問題進行思考,然后通過匯編語言提供的I/O指令和中斷子功能,編程實現(xiàn)對硬盤的MBR,文件分配表等數(shù)據(jù)結(jié)構(gòu)的讀取,備份,修復(fù)等功能。教師通過布置一些學(xué)生比較感興趣的課外作業(yè),并適當(dāng)提供協(xié)助,往往能提高學(xué)生的學(xué)習(xí)積極性。
另外,在匯編語言的學(xué)習(xí)過程中,教師應(yīng)該有意識引導(dǎo)學(xué)生將匯編語言與高級語言的各個對應(yīng)的部分進行比較。學(xué)生在學(xué)習(xí)匯編語言之前,通常已經(jīng)學(xué)過一門高級語言,如C/C++等。高級語言在編譯的時候,一般是先轉(zhuǎn)換成匯編代碼,所以它們具有相通性。大部分學(xué)生編寫應(yīng)用程序的時候是用高級語言,所以通過比較分析高級語言與低級語言在數(shù)據(jù)定義,程序流程控制,函數(shù)的定義及調(diào)用等的對應(yīng)部分內(nèi)容,對于學(xué)生更好的使用高級語言編寫程序是很有幫助的。比如:匯編語言里有分段的概念,一般把變量定義到數(shù)據(jù)段,把代碼定義的代碼段。而C語言是把數(shù)據(jù)與代碼都定義在一起,那么C語言編寫的程序在編譯成可執(zhí)行文件后,它的全局變量,局部變量的空間是如何分配的。另外,對于動態(tài)內(nèi)存分配,堆與棧的區(qū)別在哪里。還有函數(shù)的定義與調(diào)用,參數(shù)的傳遞順序是如何的?這些疑問,都可以讓學(xué)生編寫簡單的C語言程序,生成可執(zhí)行文件后,然后通過調(diào)試工具進行反匯編進行分析。此外,在利用VC++,Dephi等IDE開發(fā)工具進行程序編寫時,都會用到里面的調(diào)試功能。基本上調(diào)試功能都會包括反匯編與內(nèi)存查看的功能,教師可以引導(dǎo)學(xué)生進行這方面的訓(xùn)練,使他們在以后編程時能熟練應(yīng)用這個工具解決一些疑難問題,例如:內(nèi)存非法訪問,指針的非法引用等。
4 Win32平臺下的匯編語言教學(xué)思考
目前很多高校在匯編程序設(shè)計教學(xué)中講解的是8088/8086 CPU實模式環(huán)境,實際上是虛擬8086模式,因為真正的實模式工作DOS下,而現(xiàn)在匯編語言實驗環(huán)境都是在windows 2000以上。由于現(xiàn)在大部分CPU都是32位以上,并且是工作上保護模式之上,此外這些CPU的寄存器類型以及尋址方式都已經(jīng)發(fā)生較大變化。所以教師有必要對實模式與保護模式在邏輯地址轉(zhuǎn)化為物理地址的方式的差異,還有16位與32位的指令在用法的不同點進行重點講解。因為匯編語言現(xiàn)在的實際應(yīng)用基本上采用工作于保護模式的Win32平臺,在Windows操作系統(tǒng)控制下,匯編語言雖然不能再直接存取硬件,但是能通過調(diào)用系統(tǒng)提供的API函數(shù)完成各種功能。其實這里的API函數(shù)當(dāng)于DOS下的中斷調(diào)用,但是Window API函數(shù)無論從數(shù)量上、功能上還是易用性上都大大超過了DOS或BIOS的中斷調(diào)用功能。所以現(xiàn)在在Win32平臺下,匯編語言就像高級語言一樣,可以方便的開發(fā)各種Windows應(yīng)用程序。有些教師認為,既然在實模式講解匯編語言很少涉及實用性,那就應(yīng)該直接遷移到Win32匯編平臺,講解用匯編語言開發(fā)的Windows應(yīng)用程序設(shè)計實例,從而提高學(xué)生積極性。我認為如果采用這種教學(xué)方法,可能會存在以下問題:首先由于上課時間有限,學(xué)生需要大量的時間才能熟練掌握各類指令,匯編語言的語法,程序結(jié)構(gòu)等方面的知識。如果過多涉及Windows程序設(shè)計實例,對于不熟悉Windows編程機制的學(xué)生的來說,又多了一個不小的學(xué)習(xí)負擔(dān),這樣子反而影響了匯編語言基礎(chǔ)知識的掌握。另外,DOS下的實模式與Window下的保護模式下的編程在本質(zhì)上并無很大的區(qū)別,只要學(xué)生熟練掌握各類指令用法,理解16位與32位的指令及尋址方式的區(qū)別,邏輯地址與物理地址轉(zhuǎn)換機制等知識,他們就可以通過自主學(xué)習(xí),較容易的掌握用匯編語言進行Win32應(yīng)用程序的開發(fā)。對于教師,除了幫學(xué)生打好匯編語言的基礎(chǔ),可以適當(dāng)以課外作業(yè)的形式,引入一些匯編語言在不同應(yīng)用領(lǐng)域的簡單實例,如加密與解密,軟件的逆向工程等,這些課外作業(yè)的完成對學(xué)生匯編語言的應(yīng)用能力的提高將會有不小的幫助。
5 結(jié)束語
匯編語言難教難學(xué)是教師與學(xué)生的共識,但是作為計算機科學(xué)中一門低級程序設(shè)計語言,通過對它的良好掌握,確實可以促進對計算機軟硬件底層的了解,而這又能促進編程能力的提高。作為教師,在教學(xué)中應(yīng)該不斷嘗新的教學(xué)方法,不斷積累經(jīng)驗,只有這樣,才能把這門課上好。
參考文獻:
1.1從知識點講授到以系統(tǒng)設(shè)計為主線的教學(xué)改革
我國高校在2世紀(jì)8年代初開始在少數(shù)高校開設(shè)單片機課程,面向電子和計算機專業(yè)高年級本科生和研究生,教材內(nèi)容基本是單片機生產(chǎn)商提供的技術(shù)手冊、匯編程序設(shè)計和計算機原理與接口技術(shù)的綜合體。目前單片機教材雖然較多,但基本延續(xù)了這種傳統(tǒng)的教學(xué)思路,即以單片機的知識點為主線進行單元技術(shù)教學(xué)。隨著單片機教學(xué)在各層次學(xué)校的廣泛普及,這種教學(xué)思路顯現(xiàn)了明顯的不適應(yīng)。系統(tǒng)設(shè)計性內(nèi)容缺失和細節(jié)內(nèi)容深度不夠,使一般學(xué)生在實際應(yīng)用過程中仍然會遇到許多迷茫的問題。目前單片機基礎(chǔ)課教材的一個普遍性的問題是教學(xué)集中在分散的各個點,而對單片機系統(tǒng)整體結(jié)構(gòu)性考慮不夠;重在局部和單元模塊,缺乏組織成項目的考慮。這種問題嚴(yán)重地體現(xiàn)在系統(tǒng)軟件設(shè)計中,一般學(xué)生會做例題和作業(yè),不會設(shè)計解決實際任務(wù)的系統(tǒng)軟件。因此,單片機基礎(chǔ)課程教學(xué)改革的一個重點就是從知識點講授到以系統(tǒng)設(shè)計為主線,基于課程整體性并結(jié)合項目系統(tǒng)整體性考慮實施單元教學(xué),重點提升學(xué)生系統(tǒng)性、綜合性設(shè)計能力。
1.2單片機與其它課程教學(xué)形成良性互動
在目前課程體系中,考慮到知識銜接關(guān)系,單片機課程在模擬電子技術(shù)、數(shù)字電路、計算機組成(微機原理與接口)、匯編程序設(shè)計等課程之后,一般安排在第6學(xué)期。這個安排的問題是學(xué)生實際綜合應(yīng)用及拓展學(xué)習(xí)的時間較短。這在單片機進入我國高校的早期階段僅高端學(xué)生學(xué)習(xí)的情況下是合理的,在目前單片機普及教學(xué)情況下,作為工具和重要的學(xué)科基礎(chǔ)課,單片機課程應(yīng)盡早讓學(xué)生掌握,對其熟練和提高系統(tǒng)設(shè)計能力、提高學(xué)習(xí)興趣、結(jié)合和促進其它課程學(xué)習(xí)將產(chǎn)生良好作用。單片機基礎(chǔ)課程涉及到的模擬電子技術(shù)、數(shù)字電路等知識,是相對簡單的,在課程中從應(yīng)用的角度介紹即可,對單片機課程的教學(xué)沒有影響。實際上,有些同學(xué)從大一就開始自學(xué)單片機而且都取得了很好的效果,這對我們教學(xué)是一個很好的啟示。
【關(guān)鍵詞】 單片機;PC機;串行通信;VB6.0;匯編程序
隨著科學(xué)技術(shù)的發(fā)展,在單片機應(yīng)用系統(tǒng)的設(shè)計中常常遇到計算機與外界的信息交換,即通信。鑒于PC機具有強大的監(jiān)控和管理功能,單片機具有快速以及容易控制的特點,在實際應(yīng)用中,一般都利用PC機所配置的RS-232C標(biāo)準(zhǔn)串行接口來實現(xiàn)應(yīng)用系統(tǒng)與PC機之間的數(shù)據(jù)交換。Visual Basic 6.0(簡稱VB6.0)在通信方面提供了專門的Communications控件,即控件Mscomm,可以完成簡單的串行端口通訊功能,也可以用來創(chuàng)建功能完備、事件驅(qū)動的高級通訊工具。可以利用VB6.0的Mscomm控件來實現(xiàn)PC機與多臺MCS-51單片機之間的串行通信。該控件提供了一系列標(biāo)準(zhǔn)通訊命令的使用接口,利用它可以建立與串行端口的連接,并通過串行端口連接到其它儀器設(shè)備,從而發(fā)出命令、交換數(shù)據(jù)、以及監(jiān)視和響應(yīng)連接中發(fā)生的事件與錯誤。
一、系統(tǒng)結(jié)構(gòu)設(shè)計
本系統(tǒng)是由一臺上位PC機和若個臺以M CS-51單片機為核心的下位機構(gòu)成。大多數(shù)PC機都配備有串行通訊端口RS-232C,用于兩臺計算機間進行串行通訊,但單片機的輸入、輸出電平為TTL電平,與PC機的RS-232C標(biāo)準(zhǔn)串行接口的電氣規(guī)范不一致,要實現(xiàn)單片機與PC機之間的數(shù)據(jù)通信,還必須進行電平轉(zhuǎn)換,在上位PC機與下位機的連接中采用RS-232C/RS-485轉(zhuǎn)換器,將PC機串口的標(biāo)準(zhǔn)由RS-232C電平信號轉(zhuǎn)換成RS-485的差分信號。RS-485具用“平衡差動式”的數(shù)據(jù)傳輸特性,工作于半雙工方式,RS-485的串行通信線路可采用最普遍的雙絞線,且在抗干擾能力和帶負載能力方面較其它的串行接口標(biāo)準(zhǔn)有非常明顯的優(yōu)勢,適用于高速率和遠距離的串性通信場合。PC機與多個單片機通信的電路結(jié)構(gòu)圖(如圖1所示)。
圖中的下位機是以MCS-51為核心的單片機系統(tǒng),該系統(tǒng)由一片MCS-51外加一片256K的Eprom組成,并由芯片構(gòu)成系統(tǒng)數(shù)據(jù)輸入功能塊、電機驅(qū)動功能塊、數(shù)據(jù)輸出功能塊和通信功能塊,其中通信功能塊可選擇下列三種通信方式之一,即由74LS245芯片構(gòu)成的并行通信方式、由MAX232芯片構(gòu)成的RS-232C串行通信方式以及由75176芯片構(gòu)成的RS-485串行通信方式。
圖1PC機與多個單片機通信的電路結(jié)構(gòu)圖
二、PC機的程序設(shè)計
VB6.省略mport=1 ;設(shè)置通訊端口號為com1
Mscomm1.setting=’1200,N,8,1’ ;設(shè)置為字符串形式,波特率為1200,無校驗位,8位數(shù)據(jù)位,1位停止位
Mscomm1.portopen=tu re ;打開通訊端口
(2)連接和發(fā)送緩沖區(qū)的屬性設(shè)置
Inbuffersize=256 ;接收緩沖區(qū)為256個字符
Outbuffersize=2 ;發(fā)送緩沖區(qū)為2個字符
Rthreshold =6 ;每當(dāng)緩沖區(qū)收到6個字符就產(chǎn)生oncomm事件
Sthreshold=1 ;發(fā)送緩沖區(qū)為空觸發(fā)事件
Inputlern=0 ;讀取接收緩沖區(qū)所有字符
(3)主程序清單
Private sub commandl_click()
Textl.text=’檢查下位機的連線’
Endsub
Private sub command2_click()
Comml.Output =chr(49)
Textl.text=’1#’ ;1號下位機
Endsub
Private sub command3_click()
Comml.Output =chr(50)
Textl.text=’2#’ ;2號下位機
Endsub
Private sub command4_click()
Comml.Output =chr(51)
Textl.text=’3#’ ;3號下位機
Endsub
Private sub command5_click()
End
Endsub
Private sub comm1.省略mevent
Case comEvReceive
Dim data(100)as string
Data num>=comml. input
k=data(num)
Textl.text=k
Endselect
Endsub
三、單片機的程序設(shè)計
下位機中關(guān)于RS-485的串行通信部分采用MCS-51系列單片機的匯編語言編寫。MCS-51系列單片機有一個標(biāo)準(zhǔn)的全雙工串行接口,其串行控制寄存器SCON包含串行工作方式選擇位、接收發(fā)送控制位以及串行口狀態(tài)標(biāo)志位。SCON在單片機中的地址為98H。假設(shè)MCS-51單片機從外部采集到的一組30個的數(shù)據(jù),并存在片內(nèi)RAM 20H~3DH區(qū)域中,現(xiàn)要求將這個數(shù)據(jù)塊傳送給PC機。為了保證傳送的正確,在傳送前應(yīng)由單片機先向PC機發(fā)送聯(lián)絡(luò)信號#55H,PC機準(zhǔn)確接收到后,向單片機發(fā)送回應(yīng)信號#0AAH,在檢驗無誤后,單片機才開始向PC機傳送數(shù)據(jù)。對串行口的操作可分為以下四步進行:(1)串行口初始化;(2)發(fā)送聯(lián)絡(luò)信號;(3)接收回應(yīng)信號;(4)發(fā)送數(shù)據(jù)。
匯編程序代碼如下所示:
ORG0030H
START: MOVSP, #60H
MOVTMOD, #20H ;Tl工作在模式2下
MOVTH 1, #F3H
MOVTL1, #F3H ;波特率設(shè)置為1200
SETB TRl
MOVPCON, #00H ;SMOD=0
MOVSCON, #50H ;選擇串行方式1
MOVR0, #20H
MOVR2, #30 ;數(shù)據(jù)個數(shù)
XX1: MOVA, #55H
MOVSBUF,A ;發(fā)送聯(lián)絡(luò)信號
WAITl: JBCT 1, W AIT2 ;等待發(fā)送完畢
AJMPWAIT1
WAIT2: JBC R1, READ ;等待接收完畢
AJMPWAIT2
READ:MOVA, SBUF ;接收聯(lián)絡(luò)信號
CJNEA,#0AAH, XX 1 ;接收數(shù)據(jù)不正確,重新開始
LOOP:MOVA,@R0
MOVSBUF,A
WAIT:JBC T1, LOOP1 ;等待發(fā)送完畢
AJMPWAIT
LOOPl:JNCR0
DJNZR2, LOOP
END
在VB6.0下實現(xiàn)串行通信有多種方法,除利用Windows API函數(shù)和利用Mscomm ActiveX控件外,還可通過VB調(diào)用動態(tài)鏈接庫dll來實現(xiàn),本文只介紹了如何利用Mscomm控件來實現(xiàn)串行通信。當(dāng)前,基于VB6.0的PC機與單片機的串行通信技術(shù)在我國發(fā)展已比較成熟,應(yīng)用也比較廣泛。
參考文獻
[1]陳立元.Visual Basic與RS232串行通信控制.北京:清華大學(xué)出版社,2002:48~51
[2]李朝青.PC機及單片機數(shù)據(jù)通信技術(shù).北京:北京航空航天大學(xué)出版社,2000:177
[3]胡漢才.單片機原理及系統(tǒng)設(shè)計.清華大學(xué)出版社,2003
關(guān)鍵詞:機械類專業(yè);微機原理與應(yīng)用;教學(xué)改革;教學(xué)質(zhì)量
Teaching reform and practice of principle and its applications of microcomputer for mechanical specialties
Wang Hongru, Tang Wei
Jiangsu university of science and technology, Zhenjiang, 212003, China
Abstract: To improve teaching quality of principle and its applications of microcomputer in mechanical specialties, characteristics and present situation of the course are analyzed thoroughly, and then a series of improvement strategies of teaching contents, teaching methods and means, and practice link are proposed. Results of teaching practice indicate the proposed strategies can stimulate the students’ learning interest and can exploit their learning potentialities. And teaching effect is improved consequently.
Key words: mechanical specialties; principle and its applications of microcomputer; teaching reform; teaching quality
微機原理與應(yīng)用是我校機械類專業(yè)的一門專業(yè)基礎(chǔ)課,主要講授單片機硬件知識、匯編語言程序設(shè)計方法和單片機應(yīng)用系統(tǒng)的設(shè)計[1]。對學(xué)生而言,課程內(nèi)容比較抽象、知識點多,學(xué)習(xí)難度大;對教師而言,由于計算機的快速發(fā)展而需要不斷更新、補充教學(xué)內(nèi)容,但學(xué)時卻在不斷減少。因此,結(jié)合微機原理與應(yīng)用課程的特點及現(xiàn)狀,研究提高教學(xué)質(zhì)量的方法和思路具有重要的現(xiàn)實意義。
1 課程特點及現(xiàn)狀
我校機械類本科專業(yè)對微機原理與應(yīng)用課程的基本要求是學(xué)生熟練掌握單片機技術(shù),并初步具備單片機應(yīng)用系統(tǒng)的設(shè)計開發(fā)能力。因此要求該課程的教學(xué)必須既重視理論知識的傳授,又要加強實踐、創(chuàng)新能力的培養(yǎng)。
1.1 內(nèi)容繁雜,概念抽象
微機原理與應(yīng)用課程的主要內(nèi)容有單片機的基本組成、工作原理、接口電路、匯編程序設(shè)計,以及單片機應(yīng)用系統(tǒng)的設(shè)計等[1],其中每一部分都包含諸多知識點和抽象概念。例如半導(dǎo)體存儲器部分,包含的知識點有半導(dǎo)體存儲器的分類、特點、性能指標(biāo)、基本結(jié)構(gòu)、ROM和RAM的基本工作原理、片選信號產(chǎn)生方法、常用存儲器芯片引腳功能,以及外存儲器擴展的基本方法等;涉及的主要概念有ROM和RAM、片選線和片內(nèi)地址線、地址總線和地址引腳、字選和片選,以及基本地址范圍和重疊地址范圍等,這些概念均比較抽象,理解起來有一定的難度。
1.2 學(xué)時較少,內(nèi)容更新快
機械類本科專業(yè)由于其自身的特點,分配給微機原理與應(yīng)用課程的學(xué)時本身就較少,再加上近年來隨著國家對人才需求的變化,修訂后的教學(xué)培養(yǎng)計劃幾乎每門課程的教學(xué)時數(shù)都在減少[2]。另外,隨著計算機技術(shù)的快速發(fā)展,教學(xué)內(nèi)容也需要不斷地更新、補充。
1.3 學(xué)生學(xué)習(xí)興趣普遍較低
由于單片機的工作原理看不見、摸不著,且匯編語言是面向機器的語言,再加上機械類專業(yè)學(xué)生的電路以及計算機基礎(chǔ)相對比較薄弱,因此學(xué)生感到抽象、枯燥,多數(shù)學(xué)生的學(xué)習(xí)興趣較低,學(xué)習(xí)主動性不強。
通過上述分析可以看出,如何在有限的時間內(nèi)將如此繁雜的內(nèi)容高效傳授給學(xué)生,并培養(yǎng)他們的創(chuàng)新能力,成為提高微機原理與應(yīng)用課程教學(xué)質(zhì)量的關(guān)鍵。
2 教學(xué)改革
為提高微機原理與應(yīng)用課程的教學(xué)質(zhì)量,筆者從教學(xué)內(nèi)容和教學(xué)方法與手段兩方面提出一些有針對性的改革措施。
2.1 教學(xué)內(nèi)容改革
目前,國內(nèi)高校的微機原理與應(yīng)用課程大多是以Intel 80x86系列或MCS—51系列單片機為主要教學(xué)內(nèi)容,也有采用其他類型中央處理器的單片機的。雖然處理器類型不同,但是介紹的主要內(nèi)容基本相同。我校機械類專業(yè)微機原理與應(yīng)用課程是以MCS—51系列單片機為主要內(nèi)容組織教學(xué)。然而,近年來隨著計算機技術(shù)的快速發(fā)展,出現(xiàn)了高性能嵌入式中央處理器,這對教與學(xué)而言均是一個較大的挑戰(zhàn)。因此,如何處理好教學(xué)內(nèi)容與實際應(yīng)用之間的矛盾,成為微機原理與應(yīng)用課程教學(xué)改革亟待解決的問題。
2.1.1 緊扣教學(xué)大綱,精選教材,優(yōu)化教學(xué)內(nèi)容
1.1從知識點講授到以系統(tǒng)設(shè)計為主線的教學(xué)改革
我國高校在20世紀(jì)80年代初開始在少數(shù)高校開設(shè)單片機課程,面向電子和計算機專業(yè)高年級本科生和研究生,教材內(nèi)容基本是單片機生產(chǎn)商提供的技術(shù)手冊、匯編程序設(shè)計和計算機原理與接口技術(shù)的綜合體。目前單片機教材雖然較多,但基本延續(xù)了這種傳統(tǒng)的教學(xué)思路,即以單片機的知識點為主線進行單元技術(shù)教學(xué)。隨著單片機教學(xué)在各層次學(xué)校的廣泛普及,這種教學(xué)思路顯現(xiàn)了明顯的不適應(yīng)。系統(tǒng)設(shè)計性內(nèi)容缺失和細節(jié)內(nèi)容深度不夠,使一般學(xué)生在實際應(yīng)用過程中仍然會遇到許多迷茫的問題。目前單片機基礎(chǔ)課教材的一個普遍性的問題是教學(xué)集中在分散的各個點,而對單片機系統(tǒng)整體結(jié)構(gòu)性考慮不夠;重在局部和單元模塊,缺乏組織成項目的考慮。這種問題嚴(yán)重地體現(xiàn)在系統(tǒng)軟件設(shè)計中,一般學(xué)生會做例題和作業(yè),不會設(shè)計解決實際任務(wù)的系統(tǒng)軟件。因此,單片機基礎(chǔ)課程教學(xué)改革的一個重點就是從知識點講授到以系統(tǒng)設(shè)計為主線,基于課程整體性并結(jié)合項目系統(tǒng)整體性考慮實施單元教學(xué),重點提升學(xué)生系統(tǒng)性、綜合性設(shè)計能力。
1.2單片機與其它課程教學(xué)形成良性互動
在目前課程體系中,考慮到知識銜接關(guān)系,單片機課程在模擬電子技術(shù)、數(shù)字電路、計算機組成(微機原理與接口)、匯編程序設(shè)計等課程之后,一般安排在第6學(xué)期。這個安排的問題是學(xué)生實際綜合應(yīng)用及拓展學(xué)習(xí)的時間較短。這在單片機進入我國高校的早期階段僅高端學(xué)生學(xué)習(xí)的情況下是合理的,在目前單片機普及教學(xué)情況下,作為工具和重要的學(xué)科基礎(chǔ)課,單片機課程應(yīng)盡早讓學(xué)生掌握,對其熟練和提高系統(tǒng)設(shè)計能力、提高學(xué)習(xí)興趣、結(jié)合和促進其它課程學(xué)習(xí)將產(chǎn)生良好作用。單片機基礎(chǔ)課程涉及到的模擬電子技術(shù)、數(shù)字電路等知識,是相對簡單的,在課程中從應(yīng)用的角度介紹即可,對單片機課程的教學(xué)沒有影響。實際上,有些同學(xué)從大一就開始自學(xué)單片機而且都取得了很好的效果,這對我們教學(xué)是一個很好的啟示。
2單片機理論教學(xué)的改革
單片機教材最初源于單片機生產(chǎn)廠家技術(shù)手冊、匯編語言程序設(shè)計和計算機組成與接口技術(shù)的綜合。單片機應(yīng)用初期面向?qū)ο笫侵攸c院校電子和控制專業(yè)的學(xué)生和科研人員。傳統(tǒng)的授課方式是以知識為驅(qū)動,知識點之間比較分散,學(xué)生學(xué)完之后沒有系統(tǒng)的概念,缺乏貫穿所有知識的主線,形成不了體系。這種教學(xué)方法亟待改革。
2.1以項目為主線
系統(tǒng)結(jié)構(gòu)性設(shè)計是一個重要的教學(xué)內(nèi)容。從宏觀教學(xué)的角度考慮,我們將整個教學(xué)內(nèi)容設(shè)計成基本涵蓋了本課程全部教學(xué)內(nèi)容的一個項目,基于課程整體性并結(jié)合項目系統(tǒng)整體性考慮實施單元教學(xué)。對結(jié)構(gòu)性的適當(dāng)變化和局部內(nèi)容的取舍,即可衍生和變化為其它的應(yīng)用系統(tǒng)。通過這樣的教學(xué)設(shè)計,學(xué)生加大了對課程的興趣,逐漸地積累成就感,并最終能較快地進入系統(tǒng)設(shè)計者的角色,能較好地完成實際應(yīng)用系統(tǒng)的設(shè)計。
2.2整體與局部關(guān)系
基于項目為主線的教學(xué)設(shè)計,在講述局部技術(shù)的同時進行系統(tǒng)結(jié)構(gòu)性的教學(xué),使系統(tǒng)整體性的考慮體現(xiàn)在局部中。例如LED數(shù)碼管動態(tài)顯示、步進電機驅(qū)動等技術(shù),在目前教材中基本都是完成單一這類功能的小程序,而在實際應(yīng)用系統(tǒng)中,這些功能要與系統(tǒng)核心任務(wù)并行執(zhí)行,是一個“多任務(wù)”的概念,不能簡單地將教材示例的單一的小程序搬到應(yīng)用系統(tǒng)中。其它如結(jié)合鍵盤掃描和多級LCD菜單形成多任務(wù)下的人機交互通道這些系統(tǒng)性內(nèi)容的考慮,在單元教學(xué)中都要考慮到。
2.3教學(xué)內(nèi)容和體系調(diào)整
調(diào)整應(yīng)用匯編和C語言教學(xué)的比例。匯編指令有助于對單片機硬件的學(xué)習(xí),程序代碼短、速度快,較多地應(yīng)用在對時序有嚴(yán)格要求的測控系統(tǒng)中。隨著單片機硬件和軟件編譯技術(shù)的發(fā)展,代碼長度和速度已不是主要問題,重在軟件質(zhì)量、開發(fā)周期和開發(fā)維護成本,大多數(shù)場合應(yīng)用匯編的必要性已不存在。因此教學(xué)應(yīng)以C語言為主,匯編只講解指令原理、尋址方式、必要的指令和在C語言中嵌入?yún)R編程序的方法和實例。調(diào)整單元模塊教學(xué)順序。現(xiàn)有教材中一般將人機交互設(shè)計的內(nèi)容放在最后,這不利于學(xué)生自主實踐。由于無法實施對運行過程必要的監(jiān)測,使其在沒有仿真系統(tǒng)情況下調(diào)試有相當(dāng)?shù)碾y度。因此,將人機交互部分盡可能地提前可達到很好的效果。單片機基礎(chǔ)課程傳統(tǒng)教學(xué)對新機型和新技術(shù)介紹較少,應(yīng)做適當(dāng)?shù)难a充。增加IIC、SPI、PS/2等相關(guān)技術(shù)和應(yīng)用的介紹、對其它典型單片機如AVR簡要的介紹,使學(xué)生在掌握基本單片機技術(shù)基礎(chǔ)上,能更容易地進入到高級層次的應(yīng)用。
2.4挖掘基本知識內(nèi)容的深度
把MCS-51單片機基礎(chǔ)知識講透徹,對后續(xù)嵌入式系統(tǒng)深層次學(xué)習(xí)可打下良好的基礎(chǔ)。以外中斷的重復(fù)響應(yīng)和堆棧的溢出問題為例,學(xué)生在實際應(yīng)用中經(jīng)常遇到,但在教材中沒有相應(yīng)的說明。前者是由于外中斷請求信號有毛刺,即使在進入中斷立即屏蔽中斷,且中斷請求信號已經(jīng)撤銷的情況下,在退出中斷后還將引起此中斷的重復(fù)響應(yīng)。問題在于對中斷請求信號、請求標(biāo)志和響應(yīng)過程這些基本知識講述不到位;后者是對堆棧空間位置、容量及系統(tǒng)對堆棧使用沒有準(zhǔn)確概念。類似的因基本知識講述深度不夠,導(dǎo)致學(xué)生困惑的問題還有很多。因此要注重研究實際應(yīng)用中典型問題背后的原因,深化和細化基本知識的講授,這對實際應(yīng)用和提高可起到至關(guān)重要的作用。
2.5理論課中的實踐內(nèi)容
單片機是一門實踐性極強的課程,該理論課不講授實驗實際是一個誤區(qū)。在理論課應(yīng)用Proteus做部分仿真實驗,實驗效率高、理論教學(xué)效果好,并可達到擴展學(xué)習(xí)到課外的效果。因此,需協(xié)調(diào)好理論與實驗課關(guān)系,對仿真實驗學(xué)時做一定的硬性要求。另一個問題是系統(tǒng)調(diào)試技術(shù)的教學(xué)。系統(tǒng)調(diào)試是初學(xué)者開發(fā)單片機應(yīng)用系統(tǒng)的一個難點,特別是在無仿真器情況下進行軟件調(diào)試。因此,在理論課中講述初等調(diào)試技術(shù)是有必要的,例如用示波器、LED顯示測信號、串行通信監(jiān)測程序流程等。使學(xué)生提高系統(tǒng)設(shè)計和調(diào)試技能的同時,提高了實驗課效率,使實驗課有更多的時間用于綜合性實驗中。
3實踐教學(xué)模式的改革
3.1基于項目引領(lǐng)的實驗?zāi)J?/p>
我們許多課程的實驗課教學(xué)模式,基本上都出于傳統(tǒng)的公共基礎(chǔ)課實踐教學(xué)。其特點是對單一某個理論教學(xué)內(nèi)容進行實驗演示和驗證。由于思維的慣性,這種傳統(tǒng)自然也延續(xù)到單片機實驗課中,致使學(xué)生綜合性實驗?zāi)芰^弱,完成課程設(shè)計和實際應(yīng)用設(shè)計的難度較大。作為嵌入式基礎(chǔ)和初級應(yīng)用的單片機基礎(chǔ)課程,其最大特點是工程性。單片機本身是一個強大的系統(tǒng)集成工具,學(xué)生在專業(yè)知識基礎(chǔ)上用單片機及相關(guān)器件進行綜合分析和設(shè)計,最終要制作出滿足用戶要求的產(chǎn)品。因此,單片機實驗課的主體思路是綜合性、工程性。基于這一點,我們對實驗課在宏觀上調(diào)整為基于項目引領(lǐng)的實驗?zāi)J健J紫仁菍⒒A(chǔ)性實驗以Proteus軟件仿真形式在理論課上實驗和演示;其次是配合理論課將整個學(xué)期的實驗課安排成一個應(yīng)用項目,將整個項目按照內(nèi)部資源、擴展資源、前向通道、后向通道和人機通道等部分分解成各個模塊作為每次試驗課的內(nèi)容。學(xué)生在完成單次試驗的基礎(chǔ)上,從軟硬件的角度對項目整體架構(gòu)不斷地加深認識和理解,最后完成一個項目的全過程實驗。在這個過程中,學(xué)生不斷地積累系統(tǒng)級分析設(shè)計的能力,不斷地積累著成就感。學(xué)生增強了對實驗課的興趣,大幅提高了單片機實驗課的效率和效果。
3.2多種實驗手段的綜合運用
現(xiàn)在高校學(xué)生基本上都基于實驗箱做實驗。相對于傳統(tǒng)實驗手段(手工焊接或用面包板),實驗箱在單片機應(yīng)用系統(tǒng)的軟件實驗方面具有優(yōu)越性,但在硬件實驗方面,則現(xiàn)出其明顯的弊端。學(xué)生按照實驗指導(dǎo)書的指示在實驗箱上連接各端子,學(xué)生大多不去了解這種連接后形成的電路;沒有從設(shè)計、元器件連接、調(diào)試到完成全過程的鍛煉;實驗箱資源有限;不能進行多種硬件方案的試驗、硬件電路的優(yōu)化設(shè)計和創(chuàng)新。我們根據(jù)實驗不同分別采用不同的實驗手段。應(yīng)用面包板的實驗,側(cè)重于自己設(shè)計電路實驗方案、創(chuàng)新潛能的開發(fā)和硬件系統(tǒng)級調(diào)試技術(shù)的學(xué)習(xí);手工焊接的實驗側(cè)重于實際動手技能和模塊及硬件調(diào)試方法的學(xué)習(xí)和鍛煉;應(yīng)用試驗箱的實驗則重點側(cè)重于復(fù)雜系統(tǒng)的編程和軟件調(diào)試。同時,這些實驗手段的綜合應(yīng)用,給學(xué)生創(chuàng)造了一個寬松的軟硬件實驗環(huán)境和發(fā)揮創(chuàng)造性的空間,增大了實驗課的吸引力,促進了對理論教學(xué)的理解,達到了很好的效果。
3.3發(fā)掘第二課堂的深度和廣度
單片機課外教學(xué)活動是可行和必要的。組織成立學(xué)生課外活動小組,為學(xué)生設(shè)計階段性任務(wù)。這些任務(wù)可以是承擔(dān)科研項目的分解部分,也可以是有意義和價值的小題目。學(xué)生的任務(wù)可以指標(biāo)化,小組實行優(yōu)勝劣汰。這對學(xué)生提高課程興趣、加深理解、拓展知識和帶動整體學(xué)習(xí)起到了重要作用。每年一次由教育部和信息產(chǎn)業(yè)部共同舉辦的大學(xué)生電子設(shè)計競賽,是一次極好的單片機實踐教學(xué)活動。要進行規(guī)范整理,優(yōu)化模塊設(shè)計,使之成為標(biāo)準(zhǔn)件,進而成為教學(xué)資源,進而促進教學(xué)教改工作進展和良好學(xué)風(fēng)校風(fēng)的建設(shè)。
4結(jié)語
實驗操作是理論聯(lián)系實際的重要環(huán)節(jié),實驗報告必須在科學(xué)實驗的基礎(chǔ)上進行,實驗報告的撰寫是知識系統(tǒng)化的吸收和升華的過程,實驗報告應(yīng)該體現(xiàn)完整性、規(guī)范性、正確性、有效性。現(xiàn)將撰寫實驗報告的有關(guān)內(nèi)容說明如下:
1.實驗名稱
2.實驗?zāi)康?/p>
本次實驗所涉及并要求掌握的知識點。
3.實驗內(nèi)容與實驗步驟
實驗內(nèi)容、原理、原理圖分析及具體實驗步驟。
4.實驗環(huán)境
實驗所使用的器件、儀器設(shè)備名稱及規(guī)格。
5.設(shè)計實驗數(shù)據(jù)表格
6.實驗過程與分析
詳細記錄在實驗過程中發(fā)生的故障和問題,并進行故障分析,說明故障排除的過程及方法。
根據(jù)具體實驗,記錄、整理相應(yīng)數(shù)據(jù)表格、繪制曲線、波形圖等,并進行誤差分析。
7.實驗結(jié)果總結(jié)
對實驗結(jié)果進行分析,完成思考題目,總結(jié)實驗的心得體會,并提出實驗的改進意見。
注:1.前5項必須在做實驗之前完成,并由指導(dǎo)教師簽字后才能做實驗。
2.對于學(xué)生自擬實驗題目、參與科研、創(chuàng)新實驗等形式實驗項目的實驗報告可采用論文、實驗總結(jié)報告等形式完成。
3.此封皮標(biāo)準(zhǔn)頁面為16K,實驗報告:實驗名稱:
熟悉PIC系列單片機的開發(fā)環(huán)境及簡單編程
實驗?zāi)康模?/p>
1. 通過順序結(jié)構(gòu)的簡單程序設(shè)計,熟悉PIC系列單片機的開發(fā)環(huán)境,掌握基本應(yīng)用步驟和命令;
2. 熟悉匯編語言指令,掌握基本的程序設(shè)計方法。
實驗環(huán)境:
PC計算機 MAPLAB編譯環(huán)境
實驗原理 :
實驗一:交換兩個寄存器內(nèi)容(例如交換f10H和f11H的內(nèi)容) 實驗過程比較簡單,無分支程序,而且思路十分清晰,難度不大。
實驗二:(選作)將某一寄存器內(nèi)容中的奇偶位數(shù)據(jù)交換。
本實驗的思想是:將寄存器中數(shù)據(jù)同10101010二進制數(shù)相與,得到原數(shù)據(jù)的奇數(shù)位,并向右移一位后存至一個寄存器,作為結(jié)果數(shù)據(jù)的偶位數(shù);再將寄存器中數(shù)據(jù)同01010101二進制數(shù)相與,得到原數(shù)據(jù)的偶數(shù)位,并向左移一位后存至另外一個寄存器,作為結(jié)果數(shù)據(jù)的奇位數(shù)。最后,將這兩個寄存器中的數(shù)字進行或運算,得到結(jié)果。
實驗中,使用了RO作為記錄原數(shù)奇位數(shù)的寄存器,RE作為記錄原數(shù)偶位數(shù)的寄存器,RN作為記錄員數(shù)據(jù)的寄存器,RR作為記錄結(jié)果的寄存器。
實驗程序:
實驗一:
LIST P=16C54
RA EQU 10
RB EQU 11
RT EQU 12
ORG 1FFH
GOTO MAIN
ORG 0
MAIN NOP
MOVLW 0
MOVWF RT
MOVLW 15H
MOVWF RA
MOVLW 3AH
MOVWF RB
MOVF RA,0
MOVWF RT
MOVF RB,0
MOVWF RA
MOVF RT,0
MOVWF RB
END
實驗二:(選作)
LIST P=16C54
RO EQU 10
RE EQU 11
RN EQU 13
STATU EQU 3
CARRY EQU 0
RR EQU 12
ORG 1FFH
GOTO MAIN
ORG 0
MAIN NOP
MOVLW 99H
MOVWF RN; GIVE VALUE
ANDLW B'10101010'
MOVWF RE
BCF STATU, CARRY
RRF RE; ODD->EVEN
MOVF RN,0
ANDLW &nbs p; B'01010101'
BCF STATU, CARRY
MOVWF RO
RLF RO; EVEN->ODD
MOVF RO,0
IORWF RE,0; ADD THE TWO PARTS OF THE NUMBER BY OR THEM
MOVWF RR
END
調(diào)試結(jié)果:
實驗一結(jié)果:
1、賦值后
2、調(diào)換中
3、調(diào)換后
實驗二結(jié)果:
1、賦值后
2、取奇數(shù)位的數(shù)值存入RE
3、將奇數(shù)位的數(shù)值右移一位
5、取偶數(shù)位的數(shù)值存入RO
6、將偶數(shù)位的數(shù)值左移一位
7、得到最后結(jié)果
實驗分析與實驗體會:
本實驗通過順序結(jié)構(gòu)的簡單程序設(shè)計,我基本掌握了PIC系列單片機的開發(fā)步驟和命令,熟悉了PIC系列單片機的開發(fā)環(huán)境MAPLAB,并在具體變成過程中,熟悉匯編語言指令,掌握基本的程序設(shè)計方法。
雖然本實驗是基本練習(xí),目的是為了熟悉實驗環(huán)境,但是,在實驗中還是學(xué)到了很多東西:
摘要:本文探討了基于C語言的ARM嵌入式程序設(shè)計課程中學(xué)生反映不好掌握的一些知識點。
關(guān)鍵詞:ARM嵌入式;C語言;程序設(shè)計;技巧
中圖分類號:G642
文獻標(biāo)識碼:B
引言
嵌入式C語言程序設(shè)計是利用基本的C語言知識,面向嵌入式工程實際應(yīng)用進行程序設(shè)計語言。如何能夠在嵌入式系統(tǒng)開發(fā)中熟練、正確地運用C語言開發(fā)出高質(zhì)量的應(yīng)用程序,是學(xué)習(xí)嵌入式程序設(shè)計的關(guān)鍵。下面介紹基于C語言的ARM嵌入式程序設(shè)計課程中學(xué)生反映不好掌握的一些難點。
1變量定義
先看下面一個例子:
char a; char a;
short b; char c;
char c; short b;
int
d; int
d;
這里定義的4個變量形式都一樣,只是次序不同,卻導(dǎo)致了在最終映像中不同的數(shù)據(jù)布局,如圖1所示。顯然,第2種方式節(jié)約了更多的存儲空間(Pad為無意義的填充數(shù)據(jù))。
由此可見,在變量聲明時,最好把所有相同類型的變量放在一起定義,這樣可以優(yōu)化存儲器布局。
圖1變量在數(shù)據(jù)區(qū)里的布局
對于局部變量類型的定義,一般情況下,人們總是設(shè)法使用short或char來定義變量,以節(jié)省存儲空間;但是,當(dāng)一個函數(shù)的局部變量數(shù)目有限時,其結(jié)果恰恰相反。因為編譯器會把局部變量分配給內(nèi)部寄存器,每個變量占用一個寄存器,如圖2所示。假定a1是任意可能的寄存器存儲函數(shù)的局部變量,同樣完成加1的操作,32位的int型變量最快,只用1條加法指令。而8位和16位變量,完成加法操作后,還需要在32位的寄存器中進行括號擴展,其中有符號的變量,要用邏輯左移(LSL)和算術(shù)右移(ASR)2條指令才能完成符號擴展;無符號的變量,要使用1條邏輯“與”(AND)指令對符號位進行清0。所以,使用32位int或unsingedint局部變量最有效率。
圖2不同類型局部變量的編譯結(jié)果
變量定義中,為了精簡程序,程序員總是竭力避免使用冗余變量。通常情況下這是正確的,但也有例外。
例如:冗余變量的使用與否比較。
int f(void);
int g(void);
int errs;
void test1(void)
{
errs+=f();
errs+=g();
}
void test2(void)
{
int localerrs=errs;
localerrs+=f();
localerrs+=g();
errs=localerrs;
}
在第一種情況test1()里,每次訪問全局變量errs時,都要先從相應(yīng)的存儲器Load到寄存器里,經(jīng)f()或g()函數(shù)調(diào)用后再Store回原來的存儲區(qū)里面。在這個例子里,一共要進行2次這樣的Load/Store操作(第一次是Load,第2次是Store)。而在第2種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來,整個函數(shù)就只需1次Load/Store訪問全局變量存儲器。減少存儲器訪問的次數(shù)對于系統(tǒng)性能的改善是非常有好處的。
2參數(shù)傳遞
為了使單獨編譯的C語言程序和匯編程序能夠互相調(diào)用,定義了統(tǒng)一的函數(shù)過程調(diào)用標(biāo)準(zhǔn)ATPCS(ARM-Thumb Procedure Call Standard)。ATPCS定義了寄存器組中的{R0~R3}作為參數(shù)傳遞和結(jié)果返回寄存器。如果參數(shù)數(shù)目超過4個,則使用堆棧進行傳遞。由于內(nèi)部寄存器的訪問速度遠遠大于存儲器,所以要盡量使參數(shù)傳遞在寄存器里面進行,即應(yīng)盡量把函數(shù)的參數(shù)控制在4個以下。例如:從C語言中直接調(diào)用匯編語言函數(shù):
extern void strcopy(char *d,const char *s);
int main(void){
const char src=“Source”;
char dest[10];
…
strcopy(dest,src);
…
}
AREAStrCopy,CODE,READONLY
EXPORT strcopy
strcopy
LDRBR2,[R1],#1
STRBR2,[R0],#1
CMP R2,#0
BNE strcopy
MOVPC,LR
END
例子中的函數(shù)strcopy(dest,src)用匯編來實現(xiàn)。根據(jù)ATPCS的定義,函數(shù)參數(shù)從左到右由寄存器進行傳遞,所以在匯編中可直接由R0和R1進行引用。這樣,在C語言和匯編語言之間進行相互調(diào)用就容易實現(xiàn)了。
3循環(huán)條件
計數(shù)循環(huán)是程序中十分常用的流程控制結(jié)構(gòu)。在C語言中,常用下面累加計數(shù)的循環(huán)形式:
for(loop=1;loop
這種累加計數(shù)的方法符合一般的自然思維習(xí)慣,所以下面這種遞減計數(shù)方法很少使用:
for(loop= limit;loop!=0;loop--)
這2種循環(huán)形式在邏輯上并沒有效率差異,但是映射到具體的體系結(jié)構(gòu)中時,就產(chǎn)生了很大的不同,如圖3所示。
圖3不同的循環(huán)條件設(shè)置比較
從圖中可以發(fā)現(xiàn),累加法比遞減法多用了1條指令,當(dāng)循環(huán)次數(shù)比較大時,這2段代碼就會在性能上產(chǎn)生明顯的差異。
其本質(zhì)原因是:當(dāng)進行一個非0常數(shù)比較時,必須用專門的CMP指令來執(zhí)行;而當(dāng)一個變量與0進行比較時,ARM指令則可直接利用條件執(zhí)行的特性(NE)來進行判別。因此,在ARM的體系結(jié)構(gòu)下編程,最好采用遞減至0的方法來設(shè)置循環(huán)條件。
參考文獻
[1] 梁合慶等. 從C到嵌入式C編程語言[M]. 北京航空航天大學(xué)出版社,2000.
[2] 田澤. 嵌入式系統(tǒng)開發(fā)與應(yīng)用[M]. 北京航空航天大學(xué)出版社,2005.