国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來(lái)到深圳市穎特新科技有限公司!
語(yǔ)言
當(dāng)前位置:首頁(yè) >> 技術(shù)中心 >> 單片機(jī)入門(mén) >> C語(yǔ)言與匯編語(yǔ)言的區(qū)別

C語(yǔ)言與匯編語(yǔ)言的區(qū)別

關(guān)鍵字:C語(yǔ)言 匯編語(yǔ)言 單片機(jī)程序 作者:admin 來(lái)源:不詳 發(fā)布時(shí)間:2018-05-19  瀏覽:25

從事嵌入式系統(tǒng)開(kāi)發(fā)多年,對(duì)于軟件方面,從初期的單片機(jī)匯編語(yǔ)言編程,到后來(lái)的C++界面程序編寫(xiě),已有相當(dāng)多的經(jīng)驗(yàn)累積。正是有了多年的實(shí)戰(zhàn)經(jīng)驗(yàn),對(duì)于匯編與高級(jí)語(yǔ)言在原理及應(yīng)用等方面形成了自已的一些理解,也是我經(jīng)常思考的問(wèn)題,但一直沒(méi)有以書(shū)面的方式記錄下來(lái),今天之所以寫(xiě)下這些文字,正是想做一個(gè)歸納,日后也好參考。

其實(shí),C語(yǔ)言與匯編語(yǔ)言的區(qū)別一直是程序員們津津樂(lè)道的話題。如果你問(wèn)一個(gè)程序員這樣的問(wèn)題,他也許會(huì)這么回答你:“C語(yǔ)言可讀性好,代碼便于維護(hù),便于開(kāi)發(fā);匯編語(yǔ)言編寫(xiě)的程序不容易看懂,可維護(hù)性不好,但是執(zhí)行效率高。”這樣回答是沒(méi)有錯(cuò)的,但只是一個(gè)概括,不夠深入。比方說(shuō),匯編語(yǔ)言為什么執(zhí)行效率比C語(yǔ)言高呢?C語(yǔ)言的可讀性又好在哪里呢?匯編語(yǔ)言不同樣可以用注解來(lái)提高可讀性嗎?等等這些的問(wèn)題。要真正能回答這些問(wèn)題,不是一件簡(jiǎn)單的事情,也不是三言兩語(yǔ)能解釋得清的,需要比較徹底地分析匯編與C的本質(zhì)上的區(qū)別。

先說(shuō)匯編,寫(xiě)過(guò)匯編的程序員都知道,“匯編語(yǔ)言實(shí)質(zhì)上機(jī)器語(yǔ)言的助記符。”這句話需要這樣來(lái)解析:1.CPU只能運(yùn)行它所支持的指令集,而這些指令集當(dāng)中的每天條指令都是一些二進(jìn)制數(shù)的序列,也就是“0”和“1”的有序組合;2.“0”和“1”的組合不便于程序員的記憶因此有了“MOV A 0x40”等這樣的助記符,也就是說(shuō)在程序員編寫(xiě)程序的時(shí)候,用“MOV A 0x40”來(lái)代替一串“0”和“1”的序列,這樣一看就知道是吧“0x40”單元中的數(shù)據(jù)搬到累加器A當(dāng)中來(lái)。而如果是用0”和“1”的序列,毫無(wú)特征,很難被程序員記住。這也是為什么要有匯編語(yǔ)言產(chǎn)生的原因了。

以上對(duì)匯編語(yǔ)言的解釋基本上就道出了匯編語(yǔ)言的本質(zhì),知道了匯編語(yǔ)言的本質(zhì),我們不難理解,匯編語(yǔ)言編譯成CPU可執(zhí)行的機(jī)器語(yǔ)言其實(shí)只要做一個(gè)翻譯的動(dòng)作就好了,因?yàn)椋浄c對(duì)應(yīng)的二進(jìn)制指令是一一對(duì)應(yīng)的。進(jìn)而,我們?cè)賮?lái)解釋為什么匯編語(yǔ)言會(huì)比C語(yǔ)言有更高的執(zhí)行效率。

首先,我們要理解一點(diǎn),類似于C的高級(jí)語(yǔ)言面對(duì)的對(duì)象是程序員,而不是CPU,為什么這樣說(shuō)呢?原因非常簡(jiǎn)單,CPU不認(rèn)識(shí)C語(yǔ)言,CPU只認(rèn)識(shí)以“0”“1”形式存在的指令。而C語(yǔ)言的所有語(yǔ)法以及它代碼組織形式都是有助于程序員編寫(xiě)代碼的。所以,C語(yǔ)言編寫(xiě)完程序后,需要通過(guò)編譯器將C語(yǔ)言編譯成與相應(yīng)CPU指令集對(duì)應(yīng)的機(jī)器語(yǔ)言。

問(wèn)題來(lái)了,前面我們說(shuō)過(guò),匯編語(yǔ)言與機(jī)器語(yǔ)言是一一對(duì)應(yīng)的。但是C語(yǔ)言呢?當(dāng)然沒(méi)這么好事了。C語(yǔ)言的語(yǔ)法是固定的,C語(yǔ)言編寫(xiě)的程序要編譯成CPU能讀懂的機(jī)器語(yǔ)言指令沒(méi)辦法一一對(duì)應(yīng),所以就需要有編譯規(guī)則了。比方說(shuō)一個(gè)for循環(huán)會(huì)有若干條實(shí)現(xiàn)對(duì)應(yīng)for循環(huán)功能的機(jī)器指令對(duì)應(yīng),而一個(gè)switch,也相應(yīng)會(huì)有機(jī)器指令段代替。所以C語(yǔ)言最終要編譯機(jī)器代碼,必須要遵從許許多多的這樣的規(guī)則才行。

我試驗(yàn)過(guò),用C編寫(xiě)一個(gè)簡(jiǎn)單的程序,比方說(shuō)只包含一個(gè)for循環(huán),編譯出的代碼和用匯編寫(xiě)的最優(yōu)代碼幾乎是一樣。但代碼量一大,由于受制于規(guī)則(不受制也不行呀,否則編不出來(lái)),編出來(lái)的代碼與用匯編語(yǔ)言寫(xiě)出來(lái)的代碼相比就走了不少“彎路”了。雖然說(shuō),現(xiàn)在的很多C編譯器在編譯的時(shí)候都會(huì)有優(yōu)化,但是,不可能做得到效率上等同于與機(jī)器語(yǔ)言一一對(duì)應(yīng)的匯編語(yǔ)言的效率。畢竟,匯編語(yǔ)言可以理解為直接就是面對(duì)CPU的,只不過(guò)是機(jī)器語(yǔ)言用助記符代替而矣。

以上只是兩種語(yǔ)言效率上區(qū)別的一個(gè)主要原因,其實(shí),對(duì)于資源的利用上,匯編語(yǔ)言同樣有優(yōu)勢(shì)。匯編是直接面對(duì)CPU的語(yǔ)言,只要是在指令集支持的范圍內(nèi),匯編語(yǔ)言可以直接而靈活地管理包括特殊功能寄存器、通用寄存器、存儲(chǔ)單元的每一個(gè)字節(jié),甚至是每一個(gè)bit。C語(yǔ)言對(duì)內(nèi)存的使用及管理功能也是很強(qiáng)大的,但畢竟還是受制于語(yǔ)法。

舉個(gè)最簡(jiǎn)單的例子,C語(yǔ)言當(dāng)中沒(méi)有對(duì)應(yīng)三字節(jié)或是五字節(jié)的變量類型,要么int型,要么long型,所以每次申請(qǐng)必須是固定的字節(jié)數(shù),勢(shì)必造成內(nèi)存使用上的浪費(fèi)。而大部份匯編語(yǔ)言根本沒(méi)有這樣的語(yǔ)法,在偽指令的幫助下(其實(shí)也只是提高可讀性),匯編語(yǔ)言程序可以使用任意字節(jié)數(shù)的變量,當(dāng)然處理起來(lái)比C語(yǔ)言麻煩得多,最終還是一個(gè)字節(jié)一個(gè)字節(jié)地拼接處理,而用C語(yǔ)言寫(xiě)程序就輕松了,不用管這些,最終編譯器會(huì)搞定嘛。而輕松的代價(jià)就是造成了浪費(fèi)。而內(nèi)存使用效率不高同時(shí)也會(huì)影響到整個(gè)程序的整體效率。

匯編的最后部份,來(lái)說(shuō)明一下偽批令這個(gè)東西吧。一個(gè)不善于用偽指令寫(xiě)匯編程序的程序員不是一個(gè)好的程序員,這就和寫(xiě)C語(yǔ)言不用宏是一個(gè)道理。偽批令存在價(jià)值在于他提高了匯編語(yǔ)言的可讀性,同時(shí)也能簡(jiǎn)化匯編語(yǔ)言的編程。比方說(shuō)最通用的創(chuàng)建立即數(shù)名稱,而不是用二進(jìn)制或十六進(jìn)制數(shù);創(chuàng)建數(shù)據(jù)表;ARM當(dāng)中的創(chuàng)建全局及局部變量等。這個(gè)不多說(shuō)了,針對(duì)于不同的MCU或CPU有不同的偽指令。

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

可是,一旦程序大了,源碼文件一多,如果都習(xí)慣用全局變量來(lái)傳遞及存貯共用量的話,災(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)歷過(guò)吧!然而,這將埋下系統(tǒng)崩潰級(jí)別的隱患。

因?yàn)椋@些全局變量太多,而且出現(xiàn)在太多的地方,很難完全統(tǒng)計(jì)出哪些地方可能會(huì)修改它們,一量有遺漏,變量的值可能就會(huì)和我們想要的值有出入,后果非常嚴(yán)重。更有甚者,當(dāng)全局變量是指向數(shù)組的指針或者是數(shù)組本身的時(shí)候。有的程序員可能對(duì)多得數(shù)不清的這些變量感到困惑,容易犯的一個(gè)錯(cuò)誤是寫(xiě)這些全局?jǐn)?shù)組時(shí)沒(méi)有加以保護(hù),經(jīng)常都會(huì)寫(xiě)出數(shù)組的范圍,而將其它無(wú)關(guān)的變量給莫名其妙地改了。導(dǎo)致的后果可能是出錯(cuò),也有可能是死機(jī),而且,由于這種問(wèn)題極其隱蔽,很難找出來(lái)。

所以,在大的系統(tǒng)當(dāng)中,幸虧有了OS這種東西的存在,它不但能幫我們擺脫全局變量這個(gè)禍害,而幫助程序員更加方便地組織各個(gè)功能模塊。并且,讓每個(gè)任務(wù)單一化,進(jìn)而降低了程序編寫(xiě)的難度。而用匯編語(yǔ)言編寫(xiě)較大的工程,是困難重重的事情。

首先,必須面對(duì)上面提到的全局變量的問(wèn)題,另外還得面對(duì)其它的困難,比方說(shuō)內(nèi)存的使用。在C語(yǔ)言里,程序員只要申請(qǐng)各種類型的變量然后就可以使用了,而具體用的是哪個(gè)單元的空間,交給編譯器去管理就好了。而你用匯編語(yǔ)言寫(xiě)程序的時(shí)候,必須要指明所用內(nèi)存的地址,問(wèn)題來(lái)了,程序員不得不對(duì)所有內(nèi)存的使用了如指掌,因?yàn)樗袃?nèi)存單元的使用都必須體現(xiàn)出來(lái),這也是匯編語(yǔ)言的特點(diǎn)。當(dāng)程序量一旦大到某種呈度的時(shí)候,規(guī)劃這些內(nèi)存的使用本身就是一個(gè)高難度的工作,因?yàn)橥瑫r(shí)你還得保證各個(gè)地方在使用它們的時(shí)候沒(méi)有沖突。真的很難,我是有體會(huì)的。這時(shí)候,我們?cè)傧胂笠幌,如果程序太大,我們要幾個(gè)人來(lái)協(xié)作編寫(xiě)的話,問(wèn)題就更加復(fù)雜了,因?yàn),沒(méi)有了編譯器的幫忙,程序員之間要協(xié)商好內(nèi)存使用的規(guī)則,這太難了,因?yàn)槊鎸?duì)它們的只不過(guò)是一些數(shù)量龐大的地址空間,光是劃分區(qū)域倒是簡(jiǎn)單,但涉及到程序間的交互很大的麻煩就來(lái)了,每個(gè)程序員必須提供各自的變量接口,因?yàn)閰R編的可讀性本來(lái)就差,這些接口包括了每一個(gè)可能共用的變量(在匯編中只是內(nèi)存空間資源),以及說(shuō)明它們的功能,這個(gè)工作量非常大,而且一旦做得不好,很容易出錯(cuò),出了錯(cuò)還很難查。

用匯編編寫(xiě)程序還有很多比C困難的地方,再舉一個(gè)簡(jiǎn)單的例子。匯編語(yǔ)言是低級(jí)語(yǔ)言,是機(jī)器語(yǔ)言面向程序員的一個(gè)一對(duì)一的翻譯,所以對(duì)于程序員來(lái)說(shuō),它的功能不夠豐富。在C語(yǔ)言里寫(xiě)一個(gè)(13200.68/98.56)*256.24的程序,可以直接就表示成"double a; a=(13200.68/98.56)*256.24;",而在匯編里就沒(méi)這么輕松了,匯編里面一般都沒(méi)有直接支持浮點(diǎn)運(yùn)算的指令,通常情況下都是得專門(mén)編寫(xiě)一個(gè)函數(shù)來(lái)做浮點(diǎn)運(yùn)算。結(jié)果就是匯編程序編寫(xiě)比C麻煩很多,而且還不直觀。另外,用匯編語(yǔ)言編寫(xiě)程序?qū)Τ绦騿T的要求也更高,因?yàn),程序員必須能撐握CPU或MCU的內(nèi)存結(jié)構(gòu)、總線結(jié)構(gòu)、功能模塊、堆棧系統(tǒng)、中斷資源及機(jī)制等等,否則,是寫(xiě)不下去的。

最后總結(jié),C語(yǔ)言與匯編根本不是一碼事,怎么可能幾句話就能道出它們的區(qū)別呢?就目前的情形來(lái)說(shuō),由于IC工藝的成熟,MCU的存貯資源越來(lái)越便宜,工作頻率也越來(lái)越高,所以在資源利用率以及執(zhí)行效率上沒(méi)有像以前要求那么高了。而且,實(shí)現(xiàn)的功能越來(lái)越強(qiáng)大,這些因素都助長(zhǎng)了C以及C++在嵌入式開(kāi)發(fā)當(dāng)中地位越來(lái)越高。就連MCS-51的程序編寫(xiě)也以C語(yǔ)言主導(dǎo)了,這還要?dú)w功于KEIL這個(gè)強(qiáng)大且十分容易入手的工具。面向程序員的高級(jí)語(yǔ)言比面向CPU的匯編語(yǔ)言好用得,在硬件條件允許的情況下,程序員當(dāng)然選擇用高級(jí)語(yǔ)言編程,不旦提高了編程效率,也提高了代碼的可維護(hù)性,并且十分有利于編寫(xiě)大型的工程?赐耆牧藛?喜歡就一起來(lái)點(diǎn)個(gè) 贊 吧。

編輯:admin  最后修改時(shí)間:2018-05-19

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2025 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號(hào)-4