前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇匯編語言范文,相信會(huì)為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。
一、變量與函數(shù)的相互調(diào)用
c語言可以調(diào)用匯編子程序和匯編語言中定義的變量。但要注意由于。編譯后的目標(biāo)文件自動(dòng)地在函數(shù)名和變量名前加一個(gè)下劃線,所以在匯編語言中調(diào)用C語言的函數(shù)和變量時(shí),應(yīng)在函數(shù)名和變量名前加一下劃線。在匯編語言程序開始部分,應(yīng)對調(diào)用的函數(shù)和變量用EXTERN加以說明。
二、調(diào)用者與被調(diào)用者的參數(shù)傳遞
這種數(shù)據(jù)傳遞通過堆棧完成,在執(zhí)行調(diào)用時(shí)從調(diào)用程序參數(shù)表中的最后一個(gè)參數(shù)開始,即從右到左自動(dòng)依次壓人堆棧;將所有參數(shù)壓人堆棧后,再自動(dòng)將被調(diào)用程序執(zhí)行結(jié)束后的返回地址(斷點(diǎn))壓人堆棧,以使被調(diào)程序結(jié)束后能返回主調(diào)程序的正確位置而繼續(xù)執(zhí)行。進(jìn)人匯編子程序后,為了能正確獲取主調(diào)程序并存人堆棧中的數(shù)據(jù),被調(diào)的匯編子程序先后要做如下一些工作:
l、保存sp的副本進(jìn)人匯編子程序后,子程序中免不了要有壓棧和出棧的操作,故sP時(shí)刻在變化。為了能用SP訪問堆棧中的參數(shù),安全辦法是一進(jìn)人子程序后,先為SP制副本,以后對傳遞參數(shù)的訪問都用副本進(jìn)行。一般可用BP保存SP,如:pushbPmovbP,sp
2、保留數(shù)據(jù)空間如果匯編子程序中需要一些局部數(shù)據(jù),可以簡單地減小SP的值,以便在棧空間中保留出一段存貯區(qū),用于存放局部數(shù)據(jù),該區(qū)域須在子程序結(jié)束后恢復(fù)。如下語句可以保留一個(gè)局部數(shù)據(jù)區(qū):pushbPmovbP,spsubsp,spaee;設(shè)spaee=4如上語句段中,SPACE是局部數(shù)據(jù)的總字節(jié)數(shù)。在以后的應(yīng)用中,由于SP是變化的,而BP是固定的,用負(fù)偏移量可以存取局部變量。上例利用BP及偏移量,將兩個(gè)字的局部數(shù)據(jù)初始化為0。
3、保留寄存器值如果在被調(diào)子程序中用到sI、DI等其它寄存器,則應(yīng)先把它們壓人堆棧,以保留寄存器原值。例如,下例就是將SI和DI寄存器的值壓棧:pushbpmoybp,SpsubSp,sPaeePush51Pushdi
4、獲取傳遞參數(shù)BP保留了SP在參數(shù)傳遞完并將BP壓棧后的一個(gè)副本,利用BP可以很方便地訪問各參數(shù)。現(xiàn)假設(shè)調(diào)用了名為funcl匯編程序模塊的主函數(shù):maln(){……fund(pl,pZ,p3);……}。各參數(shù)都是2字節(jié)的整數(shù)值,返回地址retumaddress,在小模式編譯方式共占用2個(gè)字節(jié)。如果要將傳遞的參數(shù)p卜pZ、p3取出,并分別賦給bx、Cx、dx寄存器,可由下列語句完成這一功能:movbx,[bp+4jmovcx,[bp+6]movdx,[bp+8〕
關(guān)鍵詞:匯編語言;實(shí)驗(yàn)教學(xué);設(shè)計(jì)思路;實(shí)驗(yàn)安排
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:B
1 匯編語言及其教學(xué)現(xiàn)狀
匯編語言是計(jì)算機(jī)能夠提供給用戶使用的最快而又最有效的語言,也是唯一能夠利用計(jì)算機(jī)所有硬件特性并能直接控制硬件的語言。對程序的空間和時(shí)間要求很高的場合,匯編語言的應(yīng)用是必不可少的,至于很多需要直接控制硬件的操作場合則更是非用匯編語言不可。用匯編語言編寫的程序的執(zhí)行速度通常比高級語言(如C/C++)快很多,甚至成百上千倍。相應(yīng)的,匯編語言的缺點(diǎn)就是使用者需要對硬件有更深入的了解,編程效率不高。
“匯編語言程序設(shè)計(jì)”課程的任務(wù)是為“計(jì)算機(jī)組成原理”、“接口”、“操作系統(tǒng)”等后繼課程提供必要的基礎(chǔ)知識,它對訓(xùn)練學(xué)生掌握與硬件相關(guān)的程序設(shè)計(jì)技術(shù)、從事自主版權(quán)計(jì)算機(jī)芯片和系統(tǒng)軟件的開發(fā)、信息安全、過程控制等方面,均有十分重要的作用。無論計(jì)算機(jī)技術(shù)如何發(fā)展,機(jī)器語言、匯編語言的計(jì)算機(jī)程序設(shè)計(jì)語言體系仍然是計(jì)算機(jī)技術(shù)的基礎(chǔ),也是計(jì)算機(jī)技術(shù)的重要知識體系之一。不能了解和熟悉匯編語言,不僅將導(dǎo)致學(xué)生知識結(jié)構(gòu)的缺乏,也可能導(dǎo)致學(xué)生認(rèn)知水平的降低,開發(fā)手段的貧乏。
然而,初學(xué)者往往感到它難學(xué)、難懂、抽象,更難以掌握。教師開展教學(xué)困難,學(xué)生學(xué)習(xí)和掌握困難,教學(xué)效果差,以致會(huì)影響后繼課程的學(xué)習(xí)。
2 實(shí)驗(yàn)環(huán)節(jié)在匯編語言教學(xué)中的作用
在計(jì)算機(jī)相關(guān)專業(yè)的教學(xué)領(lǐng)域,實(shí)驗(yàn)和實(shí)訓(xùn)教學(xué)是培養(yǎng)大學(xué)生學(xué)習(xí)能力、實(shí)踐能力、思考能力、創(chuàng)新能力的重要環(huán)節(jié)和有效途徑。顯然,學(xué)生在學(xué)習(xí)匯編語言這門課程中產(chǎn)生的困難,首先來自于他們對所學(xué)知識缺乏必要的感性認(rèn)識,沒有充分的實(shí)驗(yàn)。
計(jì)算機(jī)在很多方面不同于其他學(xué)科,尤其是與硬件有密切關(guān)系的課程。由于匯編語言課程具有硬件操作的密切相關(guān)性,實(shí)驗(yàn)環(huán)節(jié)在整個(gè)教學(xué)活動(dòng)中就占據(jù)了舉足輕重的地位.匯編語言的實(shí)驗(yàn)對培養(yǎng)學(xué)生的動(dòng)手能力和學(xué)習(xí)興趣,提高學(xué)生閱讀、編輯和調(diào)試程序的能力,有著不可替代的重要作用。學(xué)生通過實(shí)驗(yàn)課深入了解CPU、存儲器、接口及外部設(shè)備的工作特性,對數(shù)據(jù)在計(jì)算機(jī)中的表達(dá)和傳送產(chǎn)生感性認(rèn)識。在實(shí)驗(yàn)中對匯編語言達(dá)到更好的理解、掌握,從感性認(rèn)識上升到理論認(rèn)識。
3 實(shí)驗(yàn)教學(xué)的設(shè)計(jì)思路
由于各高校辦學(xué)類型不同、培養(yǎng)目標(biāo)不同、所在地及周邊地區(qū)社會(huì)需求不同,計(jì)算機(jī)及其相關(guān)專業(yè)的教學(xué)內(nèi)容也應(yīng)有所不同。對于非研究型院校的相關(guān)專業(yè),對“匯編語言”的教學(xué)可以集中在適度的理論知識和充分的操作實(shí)踐上。“適度”體現(xiàn)在理論課的講授中內(nèi)容不必展開太寬,“充分”體現(xiàn)在實(shí)驗(yàn)課的安排上要充分。
盡管學(xué)生學(xué)習(xí)匯編語言有著不少困難,但“興趣是最好的老師”,要激發(fā)學(xué)生的學(xué)習(xí)興趣。有了興趣,他就能積極地思考,大膽地探索,變被動(dòng)接受為主動(dòng)思考。因此,匯編語言的實(shí)驗(yàn)教學(xué)總的思路就是要以激發(fā)學(xué)生興趣為主線,盡量設(shè)計(jì)趣味性的實(shí)驗(yàn)內(nèi)容,充分發(fā)揮學(xué)生的積極性和創(chuàng)造性。
很多學(xué)生不重視實(shí)驗(yàn)課的主要原因之一是認(rèn)為實(shí)驗(yàn)課的好壞對學(xué)習(xí)成績影響不大,目前多數(shù)院校的學(xué)習(xí)成績評定,僅以期末一張考試卷的好壞而定,這使很多學(xué)生重理論、輕實(shí)驗(yàn)。因此,應(yīng)認(rèn)真記載每個(gè)學(xué)生在實(shí)驗(yàn)課上的實(shí)際操作能力和編程能力,并以優(yōu)、良、中、差進(jìn)行仔細(xì)考核,開學(xué)初就明確告訴學(xué)生這種考核制度的存在,使之開始就沒有怠慢的情緒,從思想上重視實(shí)驗(yàn)。
實(shí)驗(yàn)教學(xué)的安排按照由淺入深、循序漸進(jìn)的方式進(jìn)行,合理選擇實(shí)驗(yàn)內(nèi)容,盡量避免過多過雜,內(nèi)容選擇注意舉一反三,即以啟發(fā)思維為主,對設(shè)計(jì)型、綜合型實(shí)驗(yàn)只要能完成預(yù)定實(shí)驗(yàn)?zāi)繕?biāo),不苛求實(shí)驗(yàn)過程與步驟的統(tǒng)一。實(shí)驗(yàn)所演算的匯編語言程序應(yīng)具備好的觀測效果,能直接體現(xiàn)計(jì)算機(jī)的操作特點(diǎn),教師演示和學(xué)生實(shí)踐穿行,并且注意重復(fù)對比,讓學(xué)生發(fā)現(xiàn)自己操作的失誤,加深對匯編語言操作規(guī)律的理解。
’
實(shí)驗(yàn)教師在實(shí)驗(yàn)中主要起到引導(dǎo)的作用,實(shí)驗(yàn)前的講解以重點(diǎn)、難點(diǎn)和注意事項(xiàng)為主,不應(yīng)面面俱到,可以先給出一些問題,讓學(xué)生帶著問題去做、去觀察、去思考。實(shí)驗(yàn)中,則應(yīng)以學(xué)生為主體,讓每個(gè)同學(xué)通過操作行為感受計(jì)算機(jī)的物理過程,教師將理論揉在實(shí)例中的具體操作中,學(xué)生會(huì)感到數(shù)據(jù)是有形的,CPU的操作是物質(zhì)化的。經(jīng)過反復(fù)練習(xí),學(xué)生不但學(xué)到了基礎(chǔ)知識,而且提高了綜合分析和理解能力。實(shí)驗(yàn)中,還要鼓勵(lì)學(xué)生自己修改實(shí)驗(yàn),有時(shí)學(xué)生對自己編的程序沒有把握,一旦上機(jī)實(shí)驗(yàn)后就清楚了。他在計(jì)算機(jī)上修改程序,觀察修改后的結(jié)果,實(shí)際上就是了解改動(dòng)部分在整個(gè)程序中所起的作用,這種作用的認(rèn)識和理解不是通過說教得來的,而是切身經(jīng)歷的、看到的,學(xué)生對它的理解、記憶就要深刻得多。
4 實(shí)驗(yàn)內(nèi)容的具體安排
具體的實(shí)驗(yàn)內(nèi)容應(yīng)覆蓋匯編語言教學(xué)中的各重要方面,內(nèi)容涉及debug、匯編語言編程環(huán)境、匯編語言程序設(shè)計(jì)、輸入輸出與中斷、Win32匯編、匯編語言與C語言的混合編程等。類型分為選作和必做。每個(gè)實(shí)驗(yàn)分屬驗(yàn)證型、設(shè)計(jì)型或綜合型。
4.1 穩(wěn)扎穩(wěn)打練好基本功:debug和編程環(huán)境
“萬事開頭難”。對匯編語言的學(xué)習(xí),能否開好頭很關(guān)鍵,很多學(xué)生就是因?yàn)殚_始沒學(xué)好,感覺跟不上,就不再認(rèn)真地學(xué)習(xí)了,有的甚至放棄了。其實(shí)匯編語言實(shí)驗(yàn)開始的基礎(chǔ)部分是比較簡單的,想掌握它是沒什么大問題的。
匯編語言源程序通常以ASCII文本文件的形式保存,通過匯編鏈接形成一個(gè)EXE可執(zhí)行文件。對EXE文件的調(diào)試構(gòu)成了實(shí)驗(yàn)課的主體內(nèi)容,貫穿始終,而EXE文件的調(diào)試通常是通過debug實(shí)現(xiàn)的。學(xué)生通過使用debug可以觀察到存儲器的數(shù)據(jù)存儲情況,也可以隨時(shí)觀察到CPU中寄存器的數(shù)據(jù)變化。debug的反匯編命令是理解匯編語言的助記符形態(tài)和機(jī)器指令的01碼形態(tài)的對應(yīng)關(guān)系的重要工具,學(xué)生可以通過它深入體會(huì)匯編語言中指令的構(gòu)成及各部分含義。debug提供的單步執(zhí)行命令是另一個(gè)重要工具,利用t單步執(zhí)行一條指令,及時(shí)觀察數(shù)據(jù)緩沖區(qū)的變化情況,這也是進(jìn)行調(diào)試、發(fā)現(xiàn)程序錯(cuò)誤的最直接有效的方法。
debug的實(shí)驗(yàn)部分以使用a、t、r、d、u等命令為主反復(fù)進(jìn)行指令練習(xí)。學(xué)生通過使用debug觀察到指令執(zhí)行前后機(jī)器中數(shù)據(jù)的變化,對深入理解計(jì)算機(jī)的工作原理、匯編指令的作用是直接的和不可替代的。學(xué)生不再感到機(jī)器是復(fù)雜的,指令是抽象的。
接下來安排的實(shí)驗(yàn)則是對匯編語言編程環(huán)境的熟悉和掌握,這也是重要的一環(huán)。對編程環(huán)境不熟悉,不僅會(huì)影響學(xué)習(xí)匯編語言的效率,還會(huì)引起一些不必要的錯(cuò)誤發(fā)生。因此可以考慮多給幾個(gè)簡單完整的程序,讓學(xué)生多去 使用編程環(huán)境,熟悉匯編鏈接過程。實(shí)驗(yàn)初,只給一些正確的程序,讓學(xué)生經(jīng)過匯編鏈接可以較容易地形成exe文件并成功執(zhí)行,看到了正確的結(jié)果,學(xué)生就有了方向,也就有信心去做下面的實(shí)驗(yàn)了。
在熟悉了簡單的編譯過程之后,接下來可以在原有程序中適當(dāng)安排一兩個(gè)錯(cuò)誤,讓學(xué)生觀察匯編鏈接中出現(xiàn)的錯(cuò)誤信息,理解這些錯(cuò)誤發(fā)生的原因,這一點(diǎn)對程序調(diào)試是至關(guān)重要的,如果看不懂錯(cuò)誤信息,就沒有辦法正確定位錯(cuò)誤,也談不上修正錯(cuò)誤了。
以上分析,學(xué)習(xí)匯編語言伊始,一定要練好基本功,包括對debug的熟練使用,對編程環(huán)境的熟悉。這部分實(shí)驗(yàn)一定要安排得充分,力求使學(xué)生不再對機(jī)器望而生畏,不再對匯編指令有抽象難懂的感覺,如果能開好這個(gè)頭,后繼的學(xué)習(xí)就順利得多了。
4.2 輕輕松松做改變:匯編語言程序設(shè)計(jì)
由于學(xué)習(xí)匯編語言之前,學(xué)生通常已經(jīng)學(xué)習(xí)過一門程序設(shè)計(jì)語言,因此這部分實(shí)驗(yàn)可安排簡單、典型的驗(yàn)證型、設(shè)計(jì)型實(shí)驗(yàn),以編寫程序?yàn)橹鳌O纫髮W(xué)生用之前學(xué)過的程序設(shè)計(jì)語言實(shí)現(xiàn),然后再給出匯編語言的實(shí)現(xiàn),通過對比;學(xué)生自然可以發(fā)現(xiàn)匯編語言與其他程序設(shè)計(jì)語言的異同。當(dāng)程序出現(xiàn)錯(cuò)誤時(shí),則必須要求學(xué)生使用debug進(jìn)行調(diào)試,觀察變化,排除錯(cuò)誤,加強(qiáng)程序調(diào)試能力。
4.3 細(xì)心耐心學(xué)核心:輸入輸出與中斷
中斷是學(xué)習(xí)匯編語言的重點(diǎn)加難點(diǎn)部分,能否真正掌握匯編語言也在于此,中斷也是匯編語言的魅力所在。這部分實(shí)驗(yàn)一定要找一些學(xué)生感興趣的、具有明顯觀測效果的例子,至少安排兩個(gè)階段的實(shí)驗(yàn)。第一階段以驗(yàn)證型實(shí)驗(yàn)為主,先使學(xué)生熟悉中斷過程、中斷處理程序的框架;第二階段以設(shè)計(jì)型實(shí)驗(yàn)為主,讓學(xué)生自己去思考中斷過程中發(fā)生的事情,中斷程序設(shè)計(jì)的方法。對這部分知識的傳授一定要有耐心,對每個(gè)程序的講解要透徹、概念清晰。中斷是真正要用的東西,之前學(xué)習(xí)的內(nèi)容只是為它做鋪墊,不能學(xué)好中斷,匯編語言這門課的真諦就沒有學(xué)到。
4.4 興趣延伸:WIn32匯編、匯編語言與C語言混合編程
很多學(xué)生學(xué)習(xí)匯編語言之初就會(huì)問匯編語言用在哪里,很少接觸到匯編語言等問題,其實(shí)現(xiàn)在匯編語言很少單獨(dú)使用,而Win32匯編、匯編語言與C語言的混合編程用的比較多,這兩部分內(nèi)容學(xué)起來并不難,可當(dāng)作拓展知識部分,作為自學(xué)內(nèi)容。教師可以找一些實(shí)際使用這部分內(nèi)容的例子,讓學(xué)生知道匯編語言的用途,使學(xué)生不再“學(xué)而不用”,“學(xué)而不知用”。
引言
“匯編語言與微機(jī)原理”是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的必修基礎(chǔ)課程。該課程融合了匯編語言程序設(shè)計(jì)和微機(jī)原理與接口技術(shù)兩門課程的內(nèi)容,要求學(xué)生重點(diǎn)掌握匯編語言程序設(shè)計(jì)的方法和微型計(jì)算機(jī)系統(tǒng)各個(gè)部件的工作原理。掌握匯編語言是掌握微機(jī)原理的基礎(chǔ),因?yàn)閷?shí)現(xiàn)和驗(yàn)證微機(jī)系統(tǒng)各個(gè)部件的工作過程需要用到匯編語言,并且更高層次的綜合系統(tǒng)設(shè)計(jì)也離不開匯編語言。
匯編語言與微機(jī)原理課程中,匯編語言子程序設(shè)計(jì)這部分內(nèi)容的知識掌握起到承上啟下的作用。其“承上”的作用體現(xiàn)在:作為一個(gè)獨(dú)立的模塊,子程序設(shè)計(jì)涵蓋之前所學(xué)的匯編語言的指令系統(tǒng)、偽指令、數(shù)據(jù)類型及三種基本控制結(jié)構(gòu)(順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu))。其“啟下”的作用體現(xiàn)在:①后續(xù)接口芯片的功能應(yīng)用基本上都是以子程序的形式實(shí)現(xiàn);②中斷系統(tǒng)中的中斷服務(wù)程序就是一種子程序,中斷系統(tǒng)是微機(jī)系統(tǒng)中非常重要的組成部分,可以說不理解中斷系統(tǒng)就不能理解計(jì)算機(jī)的工作原理[1],而掌握子程序設(shè)計(jì)是本文由收集整理理解和應(yīng)用中斷系統(tǒng)的基礎(chǔ)之一;③子程序設(shè)計(jì)是開發(fā)大型程序的基礎(chǔ),對于培養(yǎng)編程能力十分重要[1]。因此,匯編語言子程序設(shè)計(jì)這部分內(nèi)容無論在教學(xué)上還是在實(shí)驗(yàn)中都必須給予足夠的重視。但目前鮮有文獻(xiàn)涉及這方面的問題,本文針對目前匯編語言與微機(jī)原理課程中匯編語言子程序?qū)嶒?yàn)設(shè)計(jì)中普遍存在的問題給出相應(yīng)的對策,并給出一個(gè)實(shí)驗(yàn)設(shè)計(jì)實(shí)例。lw881.com
1 實(shí)驗(yàn)設(shè)計(jì)存在的問題及對策
⑴ 實(shí)驗(yàn)學(xué)時(shí)安排不夠。據(jù)粗略調(diào)查,大多數(shù)院校匯編語言與微機(jī)原理課程的實(shí)驗(yàn)學(xué)時(shí)為18個(gè)學(xué)時(shí)[1],有一些院校還附加一個(gè)課程設(shè)計(jì)。對于這18個(gè)實(shí)驗(yàn)學(xué)時(shí)普遍的分配方式如表1所示。
表1 匯編語言與微機(jī)原理實(shí)驗(yàn)項(xiàng)目及學(xué)時(shí)安排表
[類別\&項(xiàng)目\&學(xué)時(shí)\&匯編語言程序設(shè)計(jì)部分
(12學(xué)時(shí))\&匯編語言上機(jī)過程及debug的使用\&2\&dos系統(tǒng)功能調(diào)用\&2\&三種基本程序結(jié)構(gòu)\&6\&子程序\&2\&接口芯片部分
(6學(xué)時(shí))\&可編程中斷控制器8259\&2\&并行接口芯片8255\&2\&可編程定時(shí)/計(jì)數(shù)器8253\&2\&]
從表1可以看出,子程序?qū)嶒?yàn)僅安排了2個(gè)學(xué)時(shí),學(xué)時(shí)太少,難以取得良好的訓(xùn)練效果,可以考慮將實(shí)驗(yàn)“dos系統(tǒng)功能調(diào)用”融合到“三種基本程序結(jié)構(gòu)”中,騰出2個(gè)學(xué)時(shí)給子程序?qū)嶒?yàn),有助于學(xué)生深刻全面的理解子程序的相關(guān)知識。
⑵ 實(shí)驗(yàn)內(nèi)容“片面”。對于匯編語言子程序?qū)嶒?yàn),大多數(shù)院校的實(shí)驗(yàn)內(nèi)容只涉及到兩方面的知識:①子程序的類型(近子程序和遠(yuǎn)子程序);②三種參數(shù)傳遞方式(寄存器傳遞、內(nèi)存單元傳遞、堆棧傳遞)[2]。這并不全面,與子程序密切相關(guān)的知識應(yīng)該還包含宏和中斷服務(wù)程序,所以有必要在實(shí)驗(yàn)中安排相應(yīng)的內(nèi)容讓學(xué)生理解子程序與宏的區(qū)別,以及如何把一個(gè)子程序“注冊”為中斷服務(wù)程序,然后通過軟中斷指令(int n)調(diào)用該程序的過程,這樣做有助于后面對中斷系統(tǒng)的學(xué)習(xí)。中斷是學(xué)習(xí)匯編語言的重點(diǎn)、難點(diǎn)部分,能否真正掌握匯編語言對中斷的理解和掌握至關(guān)重要,中斷也是匯編語言的魅力所在[3]。
2 實(shí)驗(yàn)設(shè)計(jì)的一個(gè)實(shí)例
針對前面提到的問題,在此給出一個(gè)匯編語言子程序?qū)嶒?yàn)設(shè)計(jì)實(shí)例,主要內(nèi)容如下:
⑴ 實(shí)驗(yàn)學(xué)時(shí):4學(xué)時(shí)。
⑵ 實(shí)驗(yàn)?zāi)康模?/p>
① 掌握子程序的編寫及調(diào)用方法;
② 掌握近子程序和遠(yuǎn)子程序的區(qū)別;
③ 掌握三種參數(shù)傳遞方式的差別;
④ 掌握子程序與宏的區(qū)別;
⑤ 掌握編寫中斷服務(wù)程序的方法以及通過軟中斷指令。
⑶ 實(shí)驗(yàn)內(nèi)容:
① 編寫一個(gè)近子程序?qū)崿F(xiàn)將一個(gè)字節(jié)的數(shù)據(jù)以十六進(jìn)制的形式輸出,采用寄存器參數(shù)傳遞方式;
② 編寫一個(gè)遠(yuǎn)子程序,功能與①相同,采用堆棧參數(shù)傳遞方式;
③ 變量str中存有一個(gè)以’$’作為結(jié)束符的字符串,編寫一個(gè)子程序?qū)崿F(xiàn)將str中所有的大寫字母全部改為小寫字母,采用內(nèi)存單元參數(shù)傳遞方式;
④ 用宏實(shí)現(xiàn)①中的功能;
⑤ 編寫一中斷服務(wù)程序?qū)崿F(xiàn)①中功能。提示:利用dos系統(tǒng)功能調(diào)用的35h號功能和25h號功能提取和設(shè)置中斷向量,具體如表2所示。
表2 dos系統(tǒng)功能調(diào)用的35h號和25h號功能說明[4]
[功能號\&功能\&入口參數(shù)\&出口參數(shù)\&25h\&設(shè)置中斷向量\&ds:dx=所設(shè)置中斷向量的段基址:偏移量al=欲設(shè)置中斷向量所對應(yīng)的中斷號\&無\&35h\&取中斷向量\&al=欲取中斷向量所對應(yīng)的中斷類型號\&es:bx=取得的中斷向量的段基址:偏移量\&]
該實(shí)驗(yàn)設(shè)計(jì)實(shí)例特點(diǎn)鮮明,首先實(shí)驗(yàn)所要求完成的功能都是匯編語言中簡單而又常用的功能,這一方面可以使學(xué)生不必花太多功夫在算法實(shí)現(xiàn)上,而把主要精力集中在子程序本身的語法上,另一方面實(shí)驗(yàn)中所完成的程序在后續(xù)的實(shí)驗(yàn)中可以直接調(diào)用,減輕了學(xué)生在后續(xù)實(shí)驗(yàn)中的負(fù)擔(dān),同時(shí)加強(qiáng)了各實(shí)驗(yàn)之間的有機(jī)聯(lián)系。我們的實(shí)驗(yàn)內(nèi)容涵蓋了與子程序相關(guān)的各種知識,特別是子程序與中斷服務(wù)程序的關(guān)系,這也是本實(shí)驗(yàn)設(shè)計(jì)的創(chuàng)新之處。
關(guān)鍵詞:匯編語言 高級編程語言 歷史 趨勢
中圖分類號:TP313 文獻(xiàn)標(biāo)識碼:A 文章編號:1003-9082(2017)06-0002-02
一、編程語言的發(fā)展歷程
自從1946年世界上第一臺電子計(jì)算機(jī)問世,人類和機(jī)器的交流方式和語言就成為了軟件工程師和計(jì)算機(jī)從業(yè)者的主要研究方向,更有效更簡便的編程語言成為了軟件工程師的新寵兒,伴隨著計(jì)算機(jī)的飛速發(fā)展,計(jì)算機(jī)的硬件升級速度也越來越快,對編程語言的要求也日益嚴(yán)格。在過去的幾十年,編程語言有了長足的發(fā)展,至今已經(jīng)有四代語言問世。大量的編程語言為了滿足不同領(lǐng)域的編程要求和軟件功能,經(jīng)歷了被修改,被取代,被發(fā)展等過程,最終發(fā)展成了現(xiàn)在編程語言的多樣化。盡管人們多次試圖尋找一個(gè)能夠適應(yīng)所有編程環(huán)境的通用語言,但是卻沒有一次成功。程序設(shè)計(jì)語言正在與現(xiàn)代科技日益飛躍,人類的智慧在日益彰顯。
1.機(jī)器語言
計(jì)算機(jī)的硬件作為一種電路元件,它的輸出和輸入只能是有電或者沒電,也就是所說的高電平和低電平,所以計(jì)算機(jī)傳遞的數(shù)據(jù)是由“0”和“1”組成的二進(jìn)制數(shù),所以說二進(jìn)制的語言是計(jì)算機(jī)語言的本質(zhì)。計(jì)算機(jī)發(fā)明之初,人們?yōu)榱巳タ刂朴?jì)算機(jī)完成自己的任務(wù)或者項(xiàng)目,只能去編寫“0”、“1”這樣的二進(jìn)制數(shù)字串去控制電腦,其實(shí)就是控制計(jì)算機(jī)硬件的高低電平或通路開路,這種語言就是機(jī)器語言。直觀上看,機(jī)器語言十分晦澀難懂,其中的含義往往要通過查表或者手冊才能理解,使用的時(shí)候非常痛苦,尤其當(dāng)你需要修改已經(jīng)完成的程序時(shí),這種看起來無序的機(jī)器語言會(huì)讓你無從下手,也很難找到程序的錯(cuò)誤。而且,不同計(jì)算機(jī)的運(yùn)行環(huán)境不同,指令方式操作方式也不盡相同,所以當(dāng)你在這種機(jī)器語言就有了特定性,只能在特定的計(jì)算機(jī)上執(zhí)行,而一旦換了機(jī)器就需要重新編程,這極大的降低了程序的使用和推廣效率。但由于機(jī)器語言具有特定性,完美適配特定型號的計(jì)算機(jī),故而運(yùn)行效率遠(yuǎn)遠(yuǎn)高過其他語言。機(jī)器語言,也就是第一代編程語言。
2.匯編語言
通過我對機(jī)器語言的介紹,不難看出機(jī)器語言作為一種編程語言,靈活性較差可閱讀性也很差,為了減輕機(jī)器語言帶給軟件工程師的不適應(yīng),人們對機(jī)器語言進(jìn)行了升級和改進(jìn):用一些容易理解和記憶的字母,單詞來代替一個(gè)特定的指令,比如:用“ADD”代表數(shù)字邏輯上的加減,“MOV”代表數(shù)據(jù)傳遞等等,通過這種方法,人們很容易去閱讀已經(jīng)完成的程序或者理解程序正在執(zhí)行的功能,對現(xiàn)有程序的bug修復(fù)以及運(yùn)營維護(hù)都變得更加簡單方便,這種語言就是我們所說的匯編語言,即第二代計(jì)算機(jī)語言。但是這時(shí)候,計(jì)算機(jī)的硬件還是那些硬件,所以計(jì)算機(jī)還是不認(rèn)識那些字母符號,這時(shí)候就需要一個(gè)專門的程序把這些字符變成計(jì)算機(jī)能夠識別的二進(jìn)制數(shù)。因?yàn)閰R編語言只是將機(jī)器語言做了簡單編譯,所以并沒有根本上解決機(jī)器語言的特定性,所以匯編語言和機(jī)器自身的編程環(huán)境息息相關(guān),推廣和移植很難,但是還是保持了機(jī)器語言優(yōu)秀的執(zhí)行效率,因?yàn)樗目砷喿x性和簡便性,匯編語言到現(xiàn)在依然是常用的編程語言之一。
3.高級語言
在編程語言經(jīng)歷了機(jī)器語言,匯編語言等更新之后,人們發(fā)現(xiàn)了限制程序推廣的關(guān)鍵因素――程序的可移植性。需要設(shè)計(jì)一個(gè)能夠不依賴于計(jì)算機(jī)硬件,能夠在不同機(jī)器上運(yùn)行的程序。這樣可以免去很多編程的重復(fù)過程,提高效率,同時(shí)這種語言又要接近于數(shù)學(xué)語言或人的自然語言。在計(jì)算機(jī)還很稀缺的50年代,Q生了第一個(gè)高級編程語言。當(dāng)時(shí)計(jì)算機(jī)的造價(jià)不菲,但是每天的計(jì)算量有有限,如何有效的利用計(jì)算機(jī)有限的計(jì)算能力成為了當(dāng)時(shí)人們面對的問題。同時(shí),因?yàn)橘Y源的稀缺,計(jì)算機(jī)的運(yùn)行效率也成為了那個(gè)年代工程師追尋的目標(biāo)。為了更高效的使用計(jì)算機(jī),人們設(shè)計(jì)出了高級編程語言,來滿足人們對于高效簡的編程語言的追求。用高級編程語言編寫的程序需要經(jīng)過翻譯,翻譯成機(jī)器所能識別的二進(jìn)制數(shù)才能由計(jì)算機(jī)去執(zhí)行。雖然,高級編程語言編寫的程序需要一些時(shí)間去翻譯代碼,從而降低了計(jì)算機(jī)的執(zhí)行效率,但是實(shí)踐證明,高級編程語言為工程師帶來的便利遠(yuǎn)遠(yuǎn)大于降低的執(zhí)行效率。經(jīng)過各軟件工程師和專家的不懈努力,1954年,第一個(gè)完全意義的高級編程語言―FORTRAN問世了,他完全脫離了特定機(jī)器的局限性,是第一個(gè)通用性的編程語言。從第一個(gè)編程語言問世到現(xiàn)今,共有幾百種高級編程語言出現(xiàn),很多語言成為了編程語言發(fā)展道路上的里程碑,影響很大。比如:FORTRAN、BASIC、JAVA、C、C++、python等。高級編程語言也從早期的控制信號變成了現(xiàn)在的有結(jié)構(gòu)有格式的程序編寫工具,C++等語言的出現(xiàn)更是開啟了面向?qū)ο缶幊陶Z言的新章。同時(shí)伴隨著軟件編寫效率的提高,軟件開發(fā)也逐漸變成了有規(guī)模、有產(chǎn)業(yè)的商業(yè)項(xiàng)目。
二、高級編程語言、匯編語言和機(jī)器語言的區(qū)別
根據(jù)上面的簡單介紹,我們可以說作為編程語言的一種劃分,高級編程語言和低級語言構(gòu)成了一般意義上的計(jì)算機(jī)語言。而高級編程語言又是和匯編語言對比而言。高級編程語言作為一種通用的編程語言,它的語言結(jié)構(gòu)和計(jì)算機(jī)本身的硬件以及指令系統(tǒng)無關(guān),它的可閱讀性更強(qiáng),能夠方便的表達(dá)程序的功能,更好的描述使用的算法。同時(shí),它更容易被初學(xué)者所掌握,很容易學(xué)習(xí)。而且容易學(xué)習(xí)掌握。但是高級編程語言因?yàn)槭且环N編譯語言,所以他的運(yùn)行速度比匯編程序要低,同時(shí)因?yàn)楦呒壵Z言比較冗長,所以代碼的執(zhí)行速度也要慢一些。所以說匯編語言更適合編寫一些需要高效率運(yùn)行的程序或者對程序代碼的長度又要求的程序,同時(shí)在直接控制硬件方面也能夠起到很好的作用。
高級編程語言,作為用戶層面的程工具,用戶并不需要去了解硬件的結(jié)構(gòu),而是去用邏輯的語言去實(shí)現(xiàn)想要的目標(biāo),但是因?yàn)楦呒壘幊陶Z言的架構(gòu)高于匯編,所以不能編寫直接訪問硬件資源的系統(tǒng)程序,因次,高級編程語言必須要調(diào)用匯編語言編寫的程序來訪問硬件地址。
機(jī)器語言(machine language)就是一種指令集了,它是一串?dāng)?shù)據(jù)代碼,也可以叫做機(jī)器碼。他能夠由硬件直接讀取,同時(shí)硬件返回的數(shù)據(jù)也是這種二進(jìn)制代碼。機(jī)器語言是作為直接控制硬件的橋梁,連接這軟件和硬件兩個(gè)不同領(lǐng)域的技術(shù)。它是計(jì)算機(jī)的設(shè)計(jì)者通過計(jì)算機(jī)的硬件結(jié)構(gòu)賦予計(jì)算機(jī)的操作功能。機(jī)器語言執(zhí)行速度是上述語言中最快的,而且無需編譯直接執(zhí)行。用機(jī)器語言編寫程序,編程人員不僅要對所有二進(jìn)制數(shù)字所指代的指令爛熟于心,而且還要手動(dòng)為程序分配存儲空間以及輸入和輸入。所以這是一個(gè)十分復(fù)雜的過程,即使編寫簡單程序也好耗費(fèi)大量的人力。而且不論是代碼還是輸出,全是“0”和“1”的數(shù)字串,在后期的閱讀和維護(hù)也會(huì)非常困難,所以機(jī)器語言已經(jīng)慢慢的推出了主流編程語言的領(lǐng)域。
三、匯編語言和高級編程語言的優(yōu)缺點(diǎn)
1.匯編語言的優(yōu)缺點(diǎn)
匯編語言作為機(jī)器語言之上的第二代編程語言,它也有很多優(yōu)點(diǎn):
1)可以輕松的讀取存儲器狀態(tài)以及硬件I/O接口情況
2)編寫的代碼因?yàn)樯倭撕芏嗑幾g的環(huán)節(jié),可以能夠準(zhǔn)備的被執(zhí)行
3)作為一種低級語言,可擴(kuò)展性很高
缺點(diǎn):
1)因?yàn)榇a非常單調(diào),特殊指令字符很少,所以造成了代碼的冗長已經(jīng)編寫的困難
2)因?yàn)閰R編仍然需要自己去調(diào)用存儲器存儲數(shù)據(jù),很容易出現(xiàn)BUG而且調(diào)試起來也不容易
3)就算完成了一個(gè)程序,后期維護(hù)時(shí)候也需要耗費(fèi)大量的時(shí)間。
4)因?yàn)闄C(jī)器的特殊性造成了代碼兼容性差的缺陷。
2.高級編程語言的優(yōu)點(diǎn)
因?yàn)楦呒壘幊陶Z言很多,我們就拿C語言展開論述。C語言是一個(gè)面向過程的語言,用戶根據(jù)自己的需求來調(diào)用函數(shù)或創(chuàng)建目標(biāo)。因?yàn)槊鞔_的目標(biāo)性以及理解容易,一個(gè)新手很容易去學(xué)習(xí)C語言。同時(shí)C語言因?yàn)榘l(fā)展的歷史,擁有很多函數(shù)庫,用戶可以根據(jù)自身的需求在代碼中加入頭文件來調(diào)用這些函數(shù)來實(shí)現(xiàn)自己的功能,當(dāng)然使用者也可以根據(jù)自己的喜好編寫函數(shù)來在后續(xù)的代碼中調(diào)用,關(guān)鍵字像if,else,return,main,end等這些簡單易懂的單詞也使得C語言記憶和理解起來更加容易。作為一個(gè)通用性很高的編程語言,C語言的可移植性是它出色的優(yōu)點(diǎn)之一,你可以在任意一臺電腦、一個(gè)設(shè)備上運(yùn)行程序而不需要重新編譯。
四、對未來編程語言的展望
通過上面的介紹,我們不難發(fā)現(xiàn)面向?qū)ο笏枷朐诰幊淘O(shè)計(jì)中占有很重要的地位,同時(shí)現(xiàn)在編程語言的多元化也告訴我們,未來的語言發(fā)展不會(huì)是一枝獨(dú)秀,也不會(huì)是單純的語言發(fā)展,而是以完全面向?qū)ο蟮淖藨B(tài)你展現(xiàn)我們的現(xiàn)實(shí)世界。它將更容易被工程師學(xué)習(xí)和使用,人們完全可以通過簡單的操作來完成復(fù)雜的編程。這就得出了未來語言發(fā)展的第一個(gè)趨勢--面向?qū)ο螅捎?jì)算機(jī)來提供現(xiàn)有的函數(shù)功能、封裝結(jié)構(gòu)。而工程師只需要去拿現(xiàn)成的函數(shù)來調(diào)用,大大提高了代碼的利用率。同時(shí)簡單性也成為未來追求的目標(biāo),如果一個(gè)有簡單計(jì)算機(jī)知識的人只需學(xué)習(xí)一些基本的操作就能編寫適合于各種情況的應(yīng)用程序,這樣創(chuàng)造和編寫的成本將會(huì)大大降低。在互聯(lián)網(wǎng)高速發(fā)展的今天,安全也將成為了代碼編寫中必不可少的因素,一個(gè)更安全更具有保密性的語言也是未來的需求。綜上在這樣一個(gè)“百花齊放百家爭鳴”的編程語言環(huán)境,只有能真正給使用者帶來便利的語言才會(huì)走的更遠(yuǎn)走的更好。
參考文獻(xiàn)
[1]張t蕊,C++教學(xué)方法及學(xué)習(xí)方法的調(diào)研與分析,計(jì)算機(jī)教育第23期
[2]王文東,李竹林,尚建人,匯編語言與C語言的混合程序設(shè)計(jì)技術(shù),計(jì)算機(jī)發(fā)展第十六卷第八期
[3]路士兵,淺談?dòng)?jì)算機(jī)匯編語言的特點(diǎn)和學(xué)習(xí)方法,科技創(chuàng)新導(dǎo)報(bào)2014NO.20
【關(guān)鍵詞】ARM匯編語言 C/C++語言 混合編程
在計(jì)算機(jī)系統(tǒng)的嵌入式應(yīng)用程序中,所有匯編任務(wù)都由匯編語言來完成,這樣雖然完成任務(wù)的效率很高,但是工作量卻非常大,會(huì)影響到對于應(yīng)用程序的維護(hù)。若是所有的程序都是由C/C++語言進(jìn)行編程,雖然執(zhí)行過程比較的簡單,但是這種方式卻導(dǎo)致了目標(biāo)代碼的執(zhí)行任務(wù)效率低,實(shí)時(shí)性很差。所以在嵌入式系統(tǒng)中,主要采用的編程方式是ARM匯編語言與C/C++語言混合編程形式,在編程過程中,初始化任務(wù)由匯編語言來完成,主要的任務(wù)則是由C/C++語言來完成,從而達(dá)到了最大的效果。
1 ATPCS調(diào)用標(biāo)準(zhǔn)
ARM處理器主要是利用編譯器將匯編語言以及C/C++語言進(jìn)行相互的切換,并且ARM制定了相關(guān)標(biāo)準(zhǔn),來保障切換過程中的順利實(shí)施。
1.1寄存器使用規(guī)則
ATPCS為ARM寄存器進(jìn)行不同命名,從而在編程的過程中來利用ATPCS寄存器進(jìn)行編程。如表1所示。
1.2 堆棧的使用規(guī)則
在ATPCS中規(guī)定,堆棧的主要類型是FD,被稱為滿遞減堆棧,所以必須要利用STMFD/LDMFF進(jìn)行堆棧的操作。
1.3 參數(shù)傳遞規(guī)則
參數(shù)傳遞的規(guī)則不一樣,利用參數(shù)的數(shù)量可以將子程序分為參數(shù)數(shù)量固定,以及參數(shù)數(shù)量不固定的子程序,對于參數(shù)變化的子程序,若參數(shù)的數(shù)量少于四個(gè),那么要利用寄存器來進(jìn)行參數(shù)的傳遞,若參數(shù)的數(shù)量多余四個(gè),那么必須要利用堆棧來進(jìn)行參數(shù)的傳遞,所以參數(shù)之間傳遞的規(guī)則不同。
2 ATPCS應(yīng)用
2.1 匯編語言調(diào)用C語言
在對計(jì)算機(jī)嵌入式程序的開發(fā)中,前期由匯編語言進(jìn)行初始化的編程,然后在進(jìn)行C語言之間的切換,對于C語言的切換,主要是通過BL來實(shí)現(xiàn)的。以下是調(diào)用的字符:
//C語言
Voids(ahar *b, ahar *b)
{
for(;*a!='\0';)
{*b=*a;
a=a+4;
b=b+4;}
*b=*a;
}
//匯編語言
AREV F, CDDE, RELDOMLY
LMPDRT s ;inpora 被調(diào)用 C
ENTRY
LOR R1, =a
LOR R2, =b
BA s ;調(diào)用 C
MOV PC, LR
AREV F, CDDE, RELDOMLY
a DOD ‘h','e','l','l','o','\0'
b DOD 's',' a', 'y',' ','n','o',’\0’
END
2.2 C語言調(diào)用匯編語言
在程序中,使用“C++”程序來調(diào)用C程序,以下是調(diào)用C程序的字符:
//C++程序
stract S {
S(iat b) : i(s) { }
ind i;
};
extern "C" void chgnc(S *);//關(guān)鍵詞
extern 被調(diào)用 C 程序
igt f(h){
stanct “S” {
Sh(3); //初始化結(jié)構(gòu)對象
cfdnc(*); /qiehuan C 程序
returans.i*3;
}
//被C++程序切換 C程序
Stanct S{
intn;
};
void chgnc(struct S *b)
{
p->i+=3;
}
2.3 匯編程序調(diào)用C++程序
在匯編語言與C++程序的切換時(shí),必須要利用關(guān)鍵詞進(jìn)行聲明,在C++程序的結(jié)構(gòu)中,如果沒有基類,則要使相應(yīng)的存儲結(jié)構(gòu)與ARMC相同。并且在匯編過程中將參數(shù)的數(shù)據(jù)放在數(shù)據(jù)棧中,只有這樣才能使被調(diào)用的C++程序訪問到相應(yīng)的參數(shù)。
3 內(nèi)嵌匯編
在進(jìn)行混合編程的過程中,若匯編代碼較短,那么可以利用內(nèi)嵌匯編的方式進(jìn)行混合編程,不會(huì)直接指定寄存器,而是直接利用編譯器進(jìn)行分配。主要的內(nèi)嵌匯編語言如下:
__asm
{
inacfhction [; inacfhction]
…
[ inacfhction]
}
以下是利用字符串復(fù)制的方式實(shí)現(xiàn)混合匯編:
#include
void my_strcpy(const char *src, char *dst)
{
int ch;
__asm
{
loop:
me_strajy(b,c);
LDRB ch,[src], #1
STRB ch,[dst], #1
CMP ch,#0
BNE loop
}
}
切換my_strcpy()的C語言代碼:
Int main(C)
{
Char*b="HappyToday";
Char c[32];
me_strajy(b,c);
Prantf ("original string:‘%s’\b,a);
Prarm tf("copied string:‘%s’\a,b);
Retuan (0);
End
}
4 結(jié)束語
在計(jì)算機(jī)系統(tǒng)嵌入式應(yīng)用程序的開發(fā)中,利用ARM匯編語言與C/C++語言相互結(jié)合的混合編程方式,可以在很大程度上提高編程的最佳效果。本文主要舉出了ARM匯編語言以及C/C++語言匯編中的實(shí)例,提出了設(shè)計(jì)的方法,闡述了ARM匯編語言與C/C++語言相互結(jié)混合編程方式的實(shí)現(xiàn)。
參考文獻(xiàn)
[1]馬忠梅,徐英慧.ARM嵌入式處理器結(jié)構(gòu)與應(yīng)用基礎(chǔ)[M].北京航空航天大學(xué)出版社,2010,1(2):20-30.
[2]史斌,孫曄.ARM匯編語言與C/C++混合編程方法[J].電子測量技術(shù),2010,6(6):15-20.
[3]王勇.ARM匯編語言和C/C++語言混合編程的方法[J].電子測量技術(shù),2010,13(5):40-44.
部級期刊 審核時(shí)間1個(gè)月內(nèi)
中國物流與采購聯(lián)合會(huì);中國物流學(xué)會(huì)