C語言與匯編語言的區(qū)別_第1頁
C語言與匯編語言的區(qū)別_第2頁
C語言與匯編語言的區(qū)別_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、如果你做得程序比較小幾k而已,用匯編代碼程度會(huì)比c小點(diǎn),應(yīng)為你可以規(guī)劃的很清楚,但是如果你的程 序稍微大一些那么 c 的優(yōu)勢就體現(xiàn)出來了,開發(fā)速度比匯編快了多得多,代碼長度也不錯(cuò)(因?yàn)槟銦o法規(guī) 劃到最最優(yōu)化),維護(hù)修改比匯編容易得多(恐怕沒有那個(gè)項(xiàng)目老板的要求不會(huì)改吧?),一般的實(shí)時(shí)性沒 有問題,真的要求時(shí)間非常精確也可以嵌入?yún)R編(以前做cpu卡,7816-3的標(biāo)準(zhǔn),就用匯編做最底層單字 節(jié)讀寫然后用c主程序調(diào)用)簡單地說,很小的程序,主要是硬件簡單控制的可以用匯編, 稍微復(fù)雜一點(diǎn)尤其是牽涉到一些計(jì)算或者管理等方面的最好用 c現(xiàn)在的c編譯器,優(yōu)化功能很好而且bug也很少了。勸你還是開始用c吧,

2、你會(huì)發(fā)現(xiàn)開發(fā)有樂趣的多(推 薦 keil c 7.04),去 (好像是這里下載) c 是高級(jí)語言中最接近低級(jí)的語言,如果運(yùn)用熟練、恰當(dāng)再結(jié)合匯編,其綜合評(píng)價(jià)高于僅使用匯編。1:若只有較簡單的邏輯操作、邏輯算法、簡單運(yùn)算,使用匯編會(huì)得到較為精準(zhǔn)的代碼,但用c也同樣可 以做到。2:若摻有復(fù)雜運(yùn)算、浮點(diǎn)運(yùn)算、非線性方程等,匯編恐怕無能為力了(最起碼難度很大)。3:單片機(jī)種類繁多,各自的匯編語法大都不一樣,若僅使用匯編,可擴(kuò)充性、可移植性都很差,用c就 會(huì)好的多。4:設(shè)想一下,當(dāng)你花了很大力氣用熟了一種匯編,又有新的品種出現(xiàn),你要么甘心落后,要么拼命跟進(jìn), 不是俄死,就是累死。以上只是個(gè)人淺見,有錯(cuò)當(dāng)

3、改。匯編:效率高,對(duì)硬件的可操控性更強(qiáng),體積小,不易維護(hù),可移植性很差C:效率比較低,硬件可操控性比較差,目標(biāo)代碼體積大,容易維護(hù),可移植性很好從事嵌入式系統(tǒng)開發(fā)多年,對(duì)于軟件方面,從初期的單片機(jī)匯編語言編程,到后來的C+界面程序編寫, 已有相當(dāng)多的經(jīng)驗(yàn)累積。正是有了多年的實(shí)戰(zhàn)經(jīng)驗(yàn),對(duì)于匯編與高級(jí)語言在原理及應(yīng)用等方面形成了自已 的一些理解,也是我經(jīng)常思考的問題,但一直沒有以書面的方式記錄下來,今天之所以寫下這些文字,正 是想做一個(gè)歸納,日后也好參考。其實(shí), C 語言與匯編語言的區(qū)別一直是程序員們津津樂道的話題。如果你問一個(gè)程序員這樣的問題,他 也許會(huì)這么回答你: “C 語言可讀性好,代碼便于

4、維護(hù),便于開發(fā);匯編語言編寫的程序不容易看懂,可維 護(hù)性不好,但是執(zhí)行效率高。 ”這樣回答是沒有錯(cuò)的,但只是一個(gè)概括,不夠深入。比方說,匯編語言為什 么執(zhí)行效率比C語言高呢? C語言的可讀性又好在哪里呢?匯編語言不同樣可以用注解來提高可讀性嗎? 等等這些的問題。要真正能回答這些問題,不是一件簡單的事情,也不是三言兩語能解釋得清的,需要比 較徹底地分析匯編與C的本質(zhì)上的區(qū)別。先說匯編,寫過匯編的程序員都知道, “匯編語言實(shí)質(zhì)上機(jī)器語言的助記符。 ”這句話需要這樣來解析:1.CPU 只能運(yùn)行它所支持的指令集,而這些指令集當(dāng)中的每天條指令都是一些二進(jìn)制數(shù)的序列,也就是“0” 和T”的有序組合;2.“

5、0”和T”的組合不便于程序員的記憶因此有了“MOV A 0 x40”等這樣的助記符,也就是 說在程序員編寫程序的時(shí)候,用“ MOV A 0 x40”來代替一串“0”和T ”的序列,這樣一看就知道是吧“0 x40”單 元中的數(shù)據(jù)搬到累加器A當(dāng)中來。而如果是用0”和T”的序列,毫無特征,很難被程序員記住。這也是為 什么要有匯編語言產(chǎn)生的原因了。以上對(duì)匯編語言的解釋基本上就道出了匯編語言的本質(zhì),知道了匯編語言的本質(zhì),我們不難理解,匯編 語言編譯成 CPU 可執(zhí)行的機(jī)器語言其實(shí)只要做一個(gè)翻譯的動(dòng)作就好了,因?yàn)?,助記符與對(duì)應(yīng)的二進(jìn)制指令 是一一對(duì)應(yīng)的。進(jìn)而,我們?cè)賮斫忉尀槭裁磪R編語言會(huì)比 C 語言有更高

6、的執(zhí)行效率。首先,我們要理解一 點(diǎn),類似于C的高級(jí)語言面對(duì)的對(duì)象是程序員,而不是CPU,為什么這樣說呢?原因非常簡單,CPU不認(rèn) 識(shí)C語言,CPU只認(rèn)識(shí)以“0”T”形式存在的指令。而C語言的所有語法以及它代碼組織形式都是有助于程 序員編寫代碼的。所以,C語言編寫完程序后,需要通過編譯器將C語言編譯成與相應(yīng)CPU指令集對(duì)應(yīng)的 機(jī)器語言。問題來了,前面我們說過,匯編語言與機(jī)器語言是一一對(duì)應(yīng)的。但是C語言呢?當(dāng)然沒這么好 事了。C語言的語法是固定的,C語言編寫的程序要編譯成CPU能讀懂的機(jī)器語言指令沒辦法一一對(duì)應(yīng), 所以就需要有編譯規(guī)則了。比方說一個(gè)for循環(huán)會(huì)有若干條實(shí)現(xiàn)對(duì)應(yīng)for循環(huán)功能的機(jī)器指

7、令對(duì)應(yīng),而一個(gè) switch,也相應(yīng)會(huì)有機(jī)器指令段代替。所以C語言最終要編譯機(jī)器代碼,必須要遵從許許多多的這樣的規(guī) 則才行。我試驗(yàn)過,用C編寫一個(gè)簡單的程序,比方說只包含一個(gè)for循環(huán),編譯出的代碼和用匯編寫的 最優(yōu)代碼幾乎是一樣。但代碼量一大,由于受制于規(guī)則(不受制也不行呀,否則編不出來),編出來的代碼 與用匯編語言寫出來的代碼相比就走了不少“彎路”了。雖然說,現(xiàn)在的很多C編譯器在編譯的時(shí)候都會(huì)有 優(yōu)化,但是,不可能做得到效率上等同于與機(jī)器語言一一對(duì)應(yīng)的匯編語言的效率。畢竟,匯編語言可以理 解為直接就是面對(duì)CPU的,只不過是機(jī)器語言用助記符代替而矣。以上只是兩種語言效率上區(qū)別的一個(gè)主要原因,

8、其實(shí),對(duì)于資源的利用上,匯編語言同樣有優(yōu)勢。匯編 是直接面對(duì)CPU的語言,只要是在指令集支持的范圍內(nèi),匯編語言可以直接而靈活地管理包括特殊功能寄 存器、通用寄存器、存儲(chǔ)單元的每一個(gè)字節(jié),甚至是每一個(gè)bit。C語言對(duì)內(nèi)存的使用及管理功能也是很強(qiáng) 大的,但畢竟還是受制于語法。舉個(gè)最簡單的例子, C 語言當(dāng)中沒有對(duì)應(yīng)三字節(jié)或是五字節(jié)的變量類型, 要么 int 型,要么 long 型,所以每次申請(qǐng)必須是固定的字節(jié)數(shù),勢必造成內(nèi)存使用上的浪費(fèi)。而大部份匯 編語言根本沒有這樣的語法,在偽指令的幫助下(其實(shí)也只是提高可讀性),匯編語言程序可以使用任意字 節(jié)數(shù)的變量,當(dāng)然處理起來比C語言麻煩得多,最終還是一個(gè)

9、字節(jié)一個(gè)字節(jié)地拼接處理,而用C語言寫程 序就輕松了,不用管這些,最終編譯器會(huì)搞定嘛。而輕松的代價(jià)就是造成了浪費(fèi)。而內(nèi)存使用效率不高同 時(shí)也會(huì)影響到整個(gè)程序的整體效率。匯編的最后部份,來說明一下偽批令這個(gè)東西吧。一個(gè)不善于用偽指令寫匯編程序的程序員不是一個(gè)好 的程序員,這就和寫C語言不用宏是一個(gè)道理。偽批令存在價(jià)值在于他提高了匯編語言的可讀性,同時(shí)也 能簡化匯編語言的編程。比方說最通用的創(chuàng)建立即數(shù)名稱,而不是用二進(jìn)制或十六進(jìn)制數(shù);創(chuàng)建數(shù)據(jù)表; ARM當(dāng)中的創(chuàng)建全局及局部變量等。這個(gè)不多說了,針對(duì)于不同的MCU或CPU有不同的偽指令。再來說說C吧,C語言豐富而實(shí)用的語句決定了C語言程序靈活性以及強(qiáng)

10、大的代碼組織能力。利用C語 言,我們可以很方便地編寫出龐大的工程,在版本管理工具的幫助下,可以很輕松地實(shí)現(xiàn)多人協(xié)作編程。 特別是引入RT-OS以后,C語言的程序框架更加靈活了,添加功能(任務(wù))更加輕松。因?yàn)?,所有的任?wù) 的調(diào)控可以直接交給操作系統(tǒng)來做,而程序員需要做的是編寫任務(wù)(含一個(gè)或多個(gè)功能模塊)的內(nèi)容,以 及設(shè)置任務(wù)的優(yōu)先級(jí),堆棧數(shù)等等。而任務(wù)間的通信可以擺脫“全局變量”這個(gè)禍害,完全可以通過信號(hào)量、 郵箱、隊(duì)列等形式來溝通。為什么說“全局變量”是禍害呢?單程序量不大的時(shí)候, “全局變量”可能是好東 西,因?yàn)榉奖懵?,哪都能改它,哪都能讀它??墒牵坏┏绦虼罅?,源碼文件一多,如果都習(xí)慣用全

11、局變 量來傳遞及存貯共用量的話,災(zāi)難就會(huì)降臨。你會(huì)看到數(shù)以千計(jì)的全局變量在各各函數(shù)間縱橫交錯(cuò),如果 這些變量不是你創(chuàng)建的,你會(huì)很難知道它的作用,因?yàn)橄到y(tǒng)太大了,它出現(xiàn)的地方太多了,而且,像這樣 的變量實(shí)在太多,你會(huì)因此而感到恐懼,相信很多有經(jīng)驗(yàn)的程序員都經(jīng)歷過吧!然而,這將埋下系統(tǒng)崩潰 級(jí)別的隱患。因?yàn)?,這些全局變量太多,而且出現(xiàn)在太多的地方,很難完全統(tǒng)計(jì)出哪些地方可能會(huì)修改它 們,一量有遺漏,變量的值可能就會(huì)和我們想要的值有出入,后果非常嚴(yán)重。更有甚者,當(dāng)全局變量是指 向數(shù)組的指針或者是數(shù)組本身的時(shí)候。有的程序員可能對(duì)多得數(shù)不清的這些變量感到困惑,容易犯的一個(gè) 錯(cuò)誤是寫這些全局?jǐn)?shù)組時(shí)沒有加以

12、保護(hù),經(jīng)常都會(huì)寫出數(shù)組的范圍,而將其它無關(guān)的變量給莫名其妙地改 了。導(dǎo)致的后果可能是出錯(cuò),也有可能是死機(jī),而且,由于這種問題極其隱蔽,很難找出來。所以,在大的系統(tǒng)當(dāng)中,幸虧有了 OS 這種東西的存在,它不但能幫我們擺脫全局變量這個(gè)禍害,而幫 助程序員更加方便地組織各個(gè)功能模塊。并且,讓每個(gè)任務(wù)單一化,進(jìn)而降低了程序編寫的難度。而用匯 編語言編寫較大的工程,是困難重重的事情。首先,必須面對(duì)上面提到的全局變量的問題,另外還得面對(duì) 其它的困難,比方說內(nèi)存的使用。在 C 語言里,程序員只要申請(qǐng)各種類型的變量然后就可以使用了,而具 體用的是哪個(gè)單元的空間,交給編譯器去管理就好了。而你用匯編語言寫程序的時(shí)

13、候,必須要指明所用內(nèi) 存的地址,問題來了,程序員不得不對(duì)所有內(nèi)存的使用了如指掌,因?yàn)樗袃?nèi)存單元的使用都必須體現(xiàn)出 來,這也是匯編語言的特點(diǎn)。當(dāng)程序量一旦大到某種呈度的時(shí)候,規(guī)劃這些內(nèi)存的使用本身就是一個(gè)高難 度的工作,因?yàn)橥瑫r(shí)你還得保證各個(gè)地方在使用它們的時(shí)候沒有沖突。真的很難,我是有體會(huì)的。這時(shí)候 我們?cè)傧胂笠幌?,如果程序太大,我們要幾個(gè)人來協(xié)作編寫的話,問題就更加復(fù)雜了,因?yàn)?,沒有了編譯 器的幫忙,程序員之間要協(xié)商好內(nèi)存使用的規(guī)則,這太難了,因?yàn)槊鎸?duì)它們的只不過是一些數(shù)量龐大的地 址空間,光是劃分區(qū)域倒是簡單,但涉及到程序間的交互很大的麻煩就來了,每個(gè)程序員必須提供各自的 變量接口,因?yàn)?/p>

14、匯編的可讀性本來就差,這些接口包括了每一個(gè)可能共用的變量(在匯編中只是內(nèi)存空間 資源),以及說明它們的功能,這個(gè)工作量非常大,而且一旦做得不好,很容易出錯(cuò),出了錯(cuò)還很難查。用 匯編編寫程序還有很多比 C 困難的地方,再舉一個(gè)簡單的例子。匯編語言是低級(jí)語言,是機(jī)器語言面向程 序員的一個(gè)一對(duì)一的翻譯,所以對(duì)于程序員來說,它的功能不夠豐富。在 C 語言里寫一個(gè)(13200.68/98.56) *256.24的程序,可以直接就表示成double a; a= (13200.68/98.56) *256.24;,而在匯編里就沒這么輕松了, 匯編里面一般都沒有直接支持浮點(diǎn)運(yùn)算的指令,通常情況下都是得專門編寫一個(gè)函數(shù)來做浮點(diǎn)運(yùn)算。結(jié)果 就是匯編程序編寫比 C 麻煩很多,而且還不直觀。另外,用匯編語言編寫程序?qū)Τ绦騿T的要求也更高,因 為,程序員必須能撐握CPU或MCU的內(nèi)存結(jié)構(gòu)、總線結(jié)構(gòu)、功能模塊、堆棧系統(tǒng)、中斷資源及機(jī)制等等, 否則,是寫不下去的。最后總結(jié),C語言與匯編根本不是一碼事,怎么可能幾句話就能道出它們的區(qū)別呢?就目前的情形來說, 由于IC工藝的成熟,MCU的存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論