c語言和組合語言的關係,C語言和組合語言的關係?

時間 2022-01-13 09:05:10

1樓:吉祥二進位制

程式設計師編寫的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格式,這個格式的實現是有鏈結器來完成的。

2樓:匿名使用者

編譯了以後位址確實是確定的,但作業系統會把它對映到實體地址上,所有每次執行的實體地址都不同。

「還有,我發現這三個位址之間都差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不應該去想它的彙編實現。實現細節就交給編譯原理和作業系統這兩門課吧。

3樓:

這麼多問題!

1. 沒有生成彙編,因為你沒有加特定的選項,你查一下tc的幫助。預設當然生成obj和exe,讓你執行它。

2. 列印出來的位址,是會改變的,因為是棧上的變數位址。你每次的結果一樣不說明什麼。你可以修改一下你的程式,比如把你的程式放在函式裡面,在不同的地方呼叫。

3. c語言的int的寬度和底層硬體/作業系統有關,32-bit或者64-bit平台。

4. 位址1245052,1245048,1245044是不是對應著c語言編譯

後生成彙編檔案中在資料段範圍中的位址?

不是,如上所述,是堆疊幀中區域性變數的位址。

5. 堆疊=棧。 你要在彙編裡面動態分配記憶體,不知道怎麼弄。

6. malloc很大的空間肯定會出錯。上限是多少?我覺得也許不能超過乙個頁面的大小(4k?)吧。我不確定。

4樓:匿名使用者

用vc的話可以看到彙編碼

因為這個位址是相對於程式自身程序的偏移,而不是在真實的物理記憶體中的位址,不受其他程序影響

變數是連續分配的

c語言沒規定c是2還是4位元組,只規定了int不超過long.各個編譯器自己可以規定大小.比如vc就是4,tc是2

堆和棧是兩個記憶體空間區域.棧裡面是放區域性變數的,堆是放malloc分配的空間.

最後乙個問題不清楚,等待高人回答

5樓:霍興有藺卿

區別是很大的。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語言差別很大。

c語言和組合語言的區別是什麼?

6樓:哇哎西西

區別如下:

1、效率不同

彙編效率高,c語言效率比較低。

2、對硬體的可操控性不同

彙編對硬體的可操控性強,c語言硬體可操控性比較差。

3、**體積大小不同

彙編目標**體積小,c語言目標**體積大。

4、維護性不同

彙編不易維護,c語言容易維護。

5、可移植性不同

彙編可移植性很差,c語言可移植性很好。

7樓:哇哎西西

1、兩者編譯組成不同。組合語言是將由0、1組成的機器語言用具有簡單語義的英文**表示,而c語言不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆疊、暫存器等。

2、兩者被計算機識別的路徑不同。組合語言通常用於對硬體的直接操控。而且c語言所編制的程式不能直接被計算機識別,必須經過轉換才能被執行。

3、兩者用處不同。組合語言通常用在程式中最核心的、控制硬體的**,一方面是安全,另一方面提高執行速度。而c語言通常用在計算機外用功能上。

8樓:會飛的小兔子

1、操作複雜程度的不同

c語言,與組合語言相比,c語言在更加接近人的一般思維,因此在程式的設計過程中比較容易操作,此外在進行一些複雜的操作,運算時,c語言比彙編就要簡單很多,尤其是c語言中的豐富的函式庫,可以直接實現一些原本很複雜的功能,並且從**量來說任意乙個c語言程式,通過反彙編之後變成組合語言程式,其長度都可能要增加好幾倍。

2、使用範圍的不同

c語言程式的事件將會只是編寫組合語言程式的幾分之一,從編寫程式的效率上來說c語言無疑更高,此外c語言是高階程式語言因此可移植性較好,不太受到到硬體裝置的限制。

在實現乙個功能時,組合語言可以直接奔著目標去,而c語言則是給你提供了一種對於對於這種問題的普遍處理辦法,不具有針對性,因此會有許多多餘的在這個問題中不需要的過程,因此可能回事程式較大,執行較慢。相對與組合語言,c語言更加適合一些較大型專案的開發。

3、執行的速度和效率不同

程式沒有了組合語言計算機直接就無法執行,因為組合語言是基於計算機底層硬體的程式設計,通過它實現了對cpu,記憶體,硬碟以及外界裝置的直接操作,因為直接所以組合語言在程式的大小,執行的速度與效率方面幾乎無可比擬,但是也是因為直接,所以匯程式設計序難以移植,且完成相同的操作**量太大,在進行一些大的專案是,單獨使用彙編進行程式設計幾乎不可能實現。

9樓:雄鷹耀

c語言和組合語言的指令集、定址方式不同,相當於兩個機器各有各的操作方式。第一、

組合語言是低階語言,在編寫程式的時候會把根據不同的情況指定使用不同的定址方式,能夠對記憶體和cpu裡的通用暫存器直接操縱。不同的計算機系列會有不同的組合語言;而c語言是高階語言,可以實現跨平台。編寫程式無需指定cpu的指令執**況,一段程式可以在不同體系結構的計算機上使用。

第二、c語言是一種比較高階的語言,作者可以直接命令計算機在不考慮硬體的情況下實現這種控制效果。組合語言是語言對硬體的直接控制,硬體間接實現了一定的控制效果。換句話說,組合語言更關注描述過程,而高階語言(比如c)更側重於描述結果。

第三、例如,組合語言中變數的賦值語句是mov a b,可以解釋為將暫存器中的值複製到b暫存器。在c語言中,b=a直接表示,這被解釋為使b=乙個由柵極電路組成的晶元。有乙個斷點,對應於計算機**中的二進位制1或0。

第四、如果您有乙個直接的人機對話,您只能輸入包含0和1的**來進行通訊。這段**太長,很難記住。因此人們想出了一種相互協議的方式,人們可以很容易地閱讀特定的方式來表達特定的計算機**,然後翻譯成計算機可以直接讀取二進位制**的表示式。

這樣一組方便的表示式被稱為計算機語言。

10樓:匿名使用者

組合語言屬低階語言,而c語言是高階語言,所謂高階語言就是更容易被人們理解的語言,其實組合語言能實現的功能往往也能通過c語言來實現,甚至用c語言會更簡單,但是組合語言有乙個優勢是其他任何語言所不具備的,這也是為什麼組合語言一直能在程式設計中占有一席之地,那就是組合語言對硬體的直接控制,也就是說他能直接對硬體操作,可以繞過作業系統等等之類。雖然有的領域其他程式設計也能實現,但是在很多地方往往是組合語言能更加簡單,更加完美的完成。而且學好了組合語言你就能對cpu是怎麼工作的有了清晰的認識,所以學計算機專業的一般都會學組合語言。

11樓:啦啦啦額

組合語言與c語言的區別:

1、在組合語言中,為乙個處理器編寫的程式不能在另一種型別的處理器上執行。在c語言程式中,程式獨立於處理器型別執行。

2、組合語言**的效能和準確性優於c**。

3、c語言必須提供額外的指令來在計算機上執行**。

4、組合語言**比c**難以理解和除錯。

5、 乙個或兩個c語言語句擴充套件為許多組合語言**。

6、組合語言可以比c別更好地進行通訊某些型別的硬體操作只能通過組合語言執行。

7、在組合語言中,我們可以直接讀取實體地址上的指標,這在c別是不可能的。

8、在組合語言中使用位更容易。

9、匯程式設計序用於在組合語言中轉換**,而編譯器用於在c編譯**。

10、c語言的可執行**大於組合語言**,因此執行時間較長。

11、由於長的可執行**,c程式的效率低於組合語言程式。

12、與彙編程式設計師相比,c語言程式設計師不需要知道處理器中的暫存器等 硬體細節。

13、最c的語言**首先自動轉換為彙編**。

組合語言和c語言哪個更難,組合語言和C語言哪個更難?

組合語言和c語言哪個更難是乙個見仁見智的事情,每個人都會有不同的答案,綜合而言,有以下幾個因素供參考 1 從閱讀性上看,c語言更容易理解,因此組合語言難度大些,同時接觸乙個別人編制的程式,量一樣的話,肯定讀懂c語言花費的時間要少些。2 從程式設計來說,究竟哪個難就不一定了,如果對彙編了解深入一些,那...

C語言與組合語言,C語言和組合語言的區別是什麼?

樓上都不懂。c相對彙編來說的優勢主要在移植性上和開發效率上。程式執行效率不如彙編。所以如果不關注程式執行效率的話,推薦用c.當然,現在絕大部分的處理器都有c編譯器。但是為什麼8086上採用組合語言呢?最主要的的原因是,8086有足夠多的通用暫存器。為什麼有足夠多的通用暫存器就不需要用c了呢?原因在於...

C語言和組合語言先學哪個比較好,c語言和組合語言,應該先學哪個?

雖然我是初學者,但我還是說一句,建議先學c語言。我就不複製網上對c語言和彙編的介紹了。直接手打 c語言更加簡單易懂,面向的使用者更大,一般如果完全沒基礎的話,絕對先學c語言。而彙編,更加底層,更難懂,但是它是連線機器語言和使用者的直接橋梁,因此一些超牛的人都是用彙編直接寫病毒 不是說c語言不能寫病毒...

彙編與C的差別,C語言和組合語言的區別是什麼?

彙編是低階語言,c是高階語言 也有人將c稱為中級語言 其主要區別是 組合語言的指令一般是與機器碼一一對應的,完成的都是原子操作 而一條c語言的指令會對應一條或多條機器碼,完成乙個完整的功能。理論上彙編的指令可以做到無冗餘,程式執行效率和記憶體利用效率能達到最高 於此同時,編寫程式的行數也是最多,最複...

組合語言和機器語言有多相近,組合語言與機器語言有多相似

計算機語言分為高階語言 組合語言和機器語言三個層次。用高階語言不需要懂計算機原理和計算機結構,高階語言開發的程式經過解釋程式或翻譯程式自動變換成機器語言。組合語言則是一種符號語言,是依賴硬體的,不同型號計算機的組合語言是不盡相同的,所以用組合語言必須懂得計算機原理和計算機結構。組合語言開發的程式,更...