1樓:胖大海君
呵呵 俺來給你一個滿意的回答吧
1 組合語言等同於計算機的機器指令 它是用助記符號表示的機器指令 二者一一對應的
使用組合語言編寫程式 可以直接控制計算機的硬體 組合語言編的源程式需要查表翻譯成
機器指令即目標**(才能被計算機執行)
在微控制器嵌入式系統中 可以使用組合語言編寫程式 佔用的儲存器空間小 程式執行速度快
2 c語言不是組合語言 它屬於高階語言 是一種近似於人類的數學語言 它的一個語句相當於幾個、 甚至十幾個機器指令 編寫程式的效率高 可移植性好 但翻譯成機器指令的質量要比組合語言差很多 c語言語句、結構簡練 在高階語言中時最小的 有對硬體操作的功能 可以替代組合語言 編寫實時性很強的微控制器嵌入式的程式**。在很多場合 都可以使用。
呵呵 滿意 就選滿意回答( 有點來晚了)
2樓:匿名使用者
組合語言,因為組合語言是直接指導微控制器執行的,佔記憶體小,直接,快捷,但就是系統可移植差,只針對一個系統
兒孫自有兒孫福,莫為兒孫做遠憂。
3樓:清風大俠
組合語言在進行精確定時的時候可以用到,比較精確。但是別的方面也可以用組合語言,只不過比較麻煩,而且對使用者的要求比較高。c語言不是組合語言,組合語言需要對硬體有一定的瞭解才可以,是直接對內部的暫存器之類的東西進行操作。
與硬體有關係。
4樓:張玉的老婆
微控制器或者arm時候會用到
組合語言和c語言各自優缺點
5樓:紫翼魔狼
c語言編屬於高階語言,具有可移植性,能夠結構化程式設計。使用標準c語言的程式,幾乎都可以不作改變移植到不同的微機平臺上,對於嵌入式等的微控制晶片,屬於標準c語言的部分也很少需要修改,而且程式很容易讀懂。
c語言編寫程式結構清晰,移植性好,容易維護和修改。
組合語言針對不同的作業系統平臺,不同的微控制器,指令都是完全不同的,即使指令相似,也不具有可移植性。但是組合語言是針對專門的控制器的,所以執行速度可以精確到一個指令週期。組合語言的程式讀懂需要藉助微控制器的指令手冊以及各個暫存器的說明,所以很難讀懂。
組合語言編寫**實時性強,能夠直接控制硬體的工作狀態,但是不具有可移植性,維護和修改困難。
c語言和組合語言的關係?
6樓:吉祥二進位制
程式設計師編寫的c語言**,首先要經過c語言編譯器,生成彙編**,這個過程稱為編譯階斷,當c語言編譯器生成彙編**後,再呼叫匯編器來將彙編**編譯成彙編指令。
這是一種站在巨人肩人的作法,最早的c++程式語言也是這樣的實現方法,只不過那時候叫cfront程式,cfront程式的作用是將c++**轉換成c語言**,類似於一個文字處理器,然後再呼叫c語言編譯器,將c原始碼編譯成彙編**,然後再呼叫匯編器將彙編**編譯成機器碼。
這個過程,在windows平臺上不容易操作,但是在linux平臺上很容易看到。以gcc這款c語言編譯器為例,它實際上是四個小程式。
cp: c語言預處理程式,有它負責進行預處理操作。
cc: c語言編譯器,它負責將c原始碼編譯成彙編**。
as: 彙編器,它負責將彙編**編譯成機器碼,一般使用gcc test.c這樣的命令編譯c語言時,會生成一個a.
out的程式,它實際上指的就是as ouput,即彙編器輸出檔案。
link: 連結器,它負責將彙編器輸入的機器碼和庫打包成一個作業系統可以執行的可執行檔案,在linux上的可執行檔案格式是elf格式,這個格式的實現是有連結器來完成的。
7樓:匿名使用者
編譯了以後地址確實是確定的,但作業系統會把它對映到實體地址上,所有每次執行的實體地址都不同。
「還有,我發現這三個地址之間都差4,是不是相當於彙編裡面,
在資料段中這三個變數是連續定義的,所以地址也是連續的,
並且說明了c語言中int型別的變數佔4個位元組,int的指標型別
也佔4個位元組.」
是的,確實是這樣編譯的。int是32位的,就是4個位元組了。32位系統的地址是32位的,指標就要4位元組。
「還有一個問題。。
c語言中分配記憶體空間的一個語句是:
int *p = null;
p = (int *)malloc(sizeof(int)*100);
是在堆裡面分配的空間,可是在彙編裡面只有**段,資料段,
堆疊段,還有附加段,"堆" 在那個段中?
我一直認為「堆疊」就是「棧」的意思,難道說「堆疊」是
「堆」+「棧」?? 」
作業系統管理堆記憶體,怎麼實現的和系統有關吧。「堆疊」就是指棧記憶體。32位系統中ds,cs,es,都和16位系統有很大差別,具體看看cpu的保護模式,在32位系統中,堆在那個段中這種說法很難解釋。
還有,在8086cpu中,暫存器是16位的,所以偏移地址是16位的,
所以一個段最大就是64kb,如果我在malloc函式裡面寫:
int *p = null;
p = (int *)malloc(sizeof(int)*1000000000000000000);
也就是說開闢了一個大於64kb的堆空間,會有什麼後果?
那是16位計算機,現在的32位系統段大小是4g,64位就更大了(一言兩語說不清楚)。
學習c語言不應考慮是怎麼實現的,c是個高階語言。它把計算機系統抽象了出來,把計算機看成是圖靈機,不同的系統上實現方法不同,所以學習c不應該去想它的彙編實現。實現細節就交給編譯原理和作業系統這兩門課吧。
8樓:霍興有藺卿
區別是很大的。c語言作為一種高階程式語言,是比較容易被人所理解的,但要經過編譯器的編譯,形成機器所能夠理解的組合語言,才能夠被機器所理解。這兩種語言的語法結構也很很大的差異。
c語言的語言你可能已經瞭解一些了,那麼我簡單說說組合語言。組合語言(assembly
language)是面向機器的程式設計語言,實際上它是把機器碼用助詞符表示出來而形成的,它的語法結構一般為:操作碼+運算元1+運算元2
以下是一個簡單的彙編程式例子:
start:in
al,20h
movbl,al
inal,30h
movcl,al
movax,0
adlop:
addal,bl
adcah,0
deccl
jnzadlop
hlt以上,每行是一個語句。可見,與c語言差別很大。
學習stm32一定要用到組合語言嗎?我只會c語言怎麼辦?
9樓:小肥楊媽媽
學stm32彙編不是必須會用的,但是如果懂彙編,會使你寫的c程式有更好的執行效率。
內容拓展:
一、在嵌入式開發中c語言和彙編兩種語言相比。彙編作為低階語言,是僅次於機器語言和硬體聯絡最緊密的語言;而c語言,嚴格的說也只能算是半個高階語言,相對於其他高階語言來說。
二、這兩者比較直觀的差異是:組合語言的實時性非常好,但可讀性差,可移植性不強;相反,c語言的可讀性強,可移植性高,但實時性相對彙編比較差。
三、利用c語言編寫微控制器程式,不用考慮程式的初始化地址,不用考慮acc,psw以及工作暫存器的保護,不用考慮溢位進位cy。而彙編這些都需要考慮到。
四、當然c語言的簡單與方便這是彙編不能比的,個人覺得把微控制器c語言和組合語言結合來編成是最好的。在需要很精確的地方就巢狀一個彙編的子程式,其他就用c語言。
10樓:楊武威
在嵌入式開發中c語言和彙編兩種語言相比。彙編作為低階語言,是僅次於機器語言和硬體聯絡最緊密的語言;而c語言,嚴格的說也只能算是半個高階語言,相對於其他高階語言來說。這兩者比較直觀的差異是:
組合語言的實時性非常好,但可讀性差,可移植性不強;相反,c語言的可讀性強,可移植性高,但實時性相對彙編比較差。
利用c語言編寫微控制器程式,不用考慮程式的初始化地址,不用考慮acc,psw以及工作暫存器的保護,不用考慮溢位進位cy。而彙編這些都需要考慮到。
比如我在編寫溫度計程式的時候遇到了這個問題,因為以前是用匯編寫的,現在翻譯成c,在處理負數轉換的時候遇到了問題。因為如果溫度計轉換晶片讀出來的是負數,他是以反碼的形式表示的,需要對其取反加一。這樣就不得不考慮加一後可能溢位的情況。
在彙編裡這種情況處理起來很簡單,低位位元組的加法用add指令,高位位元組用addc,這樣,如果低位有溢位,cy會置一,高位元組addc在計算時會將進位cy計算在內。但在c裡面就不是這回事了。低位元組有溢位,不會影響高位元組的加法,這樣計算的結果是錯誤的。
請教了下高手,解決方法可以嵌入彙編,也可以直接使用acc和cy,即每次高位的加法前要先判斷cy的值,為1則多加1,為0則正常加法。因為在引用的reg51.h的標頭檔案裡包含了這些暫存器和標誌位的定義。
當然c語言的簡單與方便這是彙編不能比的,我個人覺得把微控制器c語言和組合語言結合來編成是最好的。在需要很精確的地方就巢狀一個彙編的子程式,其他就用c語言。
所以說,學stm32彙編不是必須的,但是如果懂彙編,會使你寫的c程式有更好的執行效率。
11樓:天際月臺
stm32現在可以用官方提供的c函式庫開發,大大縮短開發時間,不過函式庫只是用來配置外設,關鍵的演算法還是得自己寫。至於彙編一般用於解決c語言無法解決的問題,如初始化c語言執行環境(這個其實廠商提供的啟動檔案幫我們搞定了),操作堆疊(作業系統裡的上下文切換需要用到彙編),對速度要求特別高的演算法等。建議還是學一下彙編,畢竟如果要移植作業系統的話,不懂彙編是不行的,而且懂彙編的話,寫c就知道怎麼寫效率會高一些。
12樓:布川邪
其實說真的,不會彙編完全沒什麼,因為stm32程式設計是用庫函式來編的,我也不彙編,我也是剛開始自學stm32,感覺跟學51思路是差不多的,只是stm32的資源豐富,有一大堆暫存器,比51多上百倍,你想記住,我覺得幾乎不可能,當然你寫庫函式其實就是在對暫存器進行配置,只不過是間接地配置而已,如果你要自學stm32的話,我建議你買「正點原子」的戰艦版,講得很詳細,400塊左右吧,我買的是奮鬥的stm32,也是400多,但是教程沒有正點原子講得好
組合語言與c語言有什麼區別
13樓:天方夜譚的哆啦a夢
1、操作複雜程度的不同
c語言,與組合語言相比,c語言在更加接近人的一般思維,因此在程式的設計過程中比較容易操作,此外在進行一些複雜的操作,運算時,c語言比彙編就要簡單很多,尤其是c語言中的豐富的函式庫,可以直接實現一些原本很複雜的功能,並且從**量來說任意一個c語言程式,通過反彙編之後變成組合語言程式,其長度都可能要增加好幾倍。
2、使用範圍的不同
c語言程式的事件將會只是編寫組合語言程式的幾分之一,從編寫程式的效率上來說c語言無疑更高,此外c語言是高階程式語言因此可移植性較好,不太受到到硬體裝置的限制。
在實現一個功能時,組合語言可以直接奔著目標去,而c語言則是給你提供了一種對於對於這種問題的普遍處理辦法,不具有針對性,因此會有許多多餘的在這個問題中不需要的過程,因此可能回事程式較大,執行較慢。相對與組合語言,c語言更加適合一些較大型專案的開發。
3、執行的速度和效率不同
程式沒有了組合語言計算機直接就無法執行,因為組合語言是基於計算機底層硬體的程式設計,通過它實現了對cpu,記憶體,硬碟以及外界裝置的直接操作,因為直接所以組合語言在程式的大小,執行的速度與效率方面幾乎無可比擬,但是也是因為直接,所以彙編程式難以移植,且完成相同的操作**量太大,在進行一些大的專案是,單獨使用匯編進行程式設計幾乎不可能實現。
求助組合語言編寫分段函式,C語言編寫什麼程式可以計算分段函式?
1 整數形式 integer number dseg segment x dw 1 fx db msg db f x dseg ends cseg segment assume cs cseg,ds dsegstart mov ax,dseg mov ds,ax mov ax,x call func...
組合語言的DW是什麼意思,組合語言中的DW怎麼用,能舉個例子說明一下嗎
dw 是定義2位元組空間的意思。dw屬於彙編的一個偽指令,dw定義字型別變數,一個字資料佔2個位元組單元,讀完一個,偏移量加2。db定義位元組型別變數,一個位元組資料佔1個位元組單元,讀完一個,偏移量加1。dd定義雙字型別變數,一個雙字資料佔4個位元組單元,讀完一個,偏移量加4。彙編指令既不控制機器...
微控制器C語言與組合語言各自的優劣比較
c語言具有很強的功能性和結構性,可以縮短微控制器控制系統的開發週期,而且易於除錯和維護,已經成為目前微控制器語言中最流行的程式語言。要是現在學的話就學c,但彙編是在以後的使用過程中必須明白的 用慣了彙編的人,總覺得高階語言 可控性 不好,不如彙編那樣隨心所欲,但基本可以通過c語言的各種技巧來消除缺點...