大家都知道計(jì)算機(jī)只能處理和識別二進(jìn)制指令,而我們利用各種高級編程語言所編寫的程序,要經(jīng)過一些列的處理步驟,最終轉(zhuǎn)變?yōu)?a target="_blank">匯編指令,再最后轉(zhuǎn)變?yōu)闄C(jī)器指令。
以上這些轉(zhuǎn)變是如何發(fā)生的就屬于大名鼎鼎的“編譯原理”所研究的范疇,作為計(jì)算機(jī)專業(yè)學(xué)生,它的重要性毫無質(zhì)疑,自然也是必修課。而我們幾年所要給大家講的是高級編程語言到匯編語言這一轉(zhuǎn)變的過程,后面就以C語言為例。
怎么樣,計(jì)科專業(yè)的學(xué)生或者學(xué)過編譯原理的看到上面幾本書熟悉嗎?這幾本書差不多是大多數(shù)高校編譯原理課程的教材了。言歸正傳,我們今天討論的是C如何轉(zhuǎn)換成匯編語言,在講之前先給大家簡要介紹下匯編語言:
匯編語言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符(Mnemonics)代替機(jī)器指令的操作碼,用地址符號(Symbol)或標(biāo)號(Label)代替指令或操作數(shù)的地址。在不同的設(shè)備中,匯編語言對應(yīng)著不同的機(jī)器語言指令集,通過匯編過程轉(zhuǎn)換成機(jī)器指令。普遍地說,特定的匯編語言和特定的機(jī)器語言指令集是一一對應(yīng)的,不同平臺之間不可直接移植。
匯編語言的主要特點(diǎn)
(1)匯編語言是直接面向處理器(Processor)的程序設(shè)計(jì)語言。
(2)匯編語言的另一個特點(diǎn)就是它所操作的對象不是具體的數(shù)據(jù),而是寄存器或者存儲器,也就是說它是直接和寄存器和存儲器打交道,這也是為什么匯編語言的執(zhí)行速度要比其它語言快,但同時這也使編程更加復(fù)雜,因?yàn)榧热粩?shù)據(jù)是存放在寄存器或存儲器中,那么必然就存在著尋址方式,也就是用什么方法找到所需要的數(shù)據(jù)。
(3)再者,匯編語言指令是機(jī)器指令的一種符號表示,而不同類型的CPU 有不同的機(jī)器指令系統(tǒng),也就有不同的匯編語言,所以,匯編語言程序與機(jī)器有著密切的關(guān)系。
簡單了解了匯編語言,那么根據(jù)編譯原理C語言是怎么轉(zhuǎn)換成匯編語言的呢?總共可分以下6個步驟:
1. 預(yù)處理 -> 2.詞法分析 -> 3.語法分析 -> 4.語義分析 -> 5.優(yōu)化 -> 6.鏈接
1. 預(yù)處理:負(fù)責(zé)執(zhí)行C語言中的#include, #if, #else 等預(yù)處理指令。注意,這里是去執(zhí)行這些預(yù)處理指令。這些預(yù)處理指令的作用是根據(jù)你的系統(tǒng)環(huán)境配湊出最終版的源代碼。
2. 詞法分析:把你定義的函數(shù)名、變量名、預(yù)留的關(guān)鍵字等抽象化,用一個符號來代替,方便編譯程序處理。例如上圖中的main, return, printf等單詞,都被看作一個符號,轉(zhuǎn)換成M, R, P。在這個過程中,會檢查你的變量名、函數(shù)名名稱是否正確。
3. 語法分析:經(jīng)過詞法分析處理之后,程序代碼已經(jīng)變成一堆符號了,例如 I S T F ... M I R P(放心,人已經(jīng)不認(rèn)識了,但是計(jì)算機(jī)能認(rèn)識)。這時的符號是打散的,語法分析負(fù)責(zé)把這些符號按照一定的結(jié)構(gòu)組織起來,形成一個抽象語法樹(這個結(jié)構(gòu)跟你寫的程序代碼的結(jié)構(gòu)是對應(yīng)起來的)。
4. 語義分析:當(dāng)構(gòu)造出這樣一個樹的結(jié)構(gòu)之后,編譯就就會檢查語法是否正確,并且去掃描這棵樹。根據(jù)這棵樹的結(jié)構(gòu),生成中間指令了。這個中間指令已經(jīng)非常接近匯編。中間指令跟匯編還是有區(qū)別的,因?yàn)椴煌瑥S家的CPU指令有所不同,所以還要根據(jù)不同廠家的CPU指令集,把這個中間指令轉(zhuǎn)換成匯編。
5. 優(yōu)化:因?yàn)?a target="_blank">程序員有時代碼寫的不太好,會導(dǎo)致一些多余的操作,或者效率低的指令。優(yōu)化過程可以找出這些毛病,自動替換成更好的指令。
6. 鏈接:以上過程只編譯了一個模塊,一個大型程序往往包好多個模塊。最后的鏈接過程負(fù)責(zé)把所有模塊組裝起來,構(gòu)造出最后可以執(zhí)行的程序。
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
795瀏覽量
41688 -
C語言
+關(guān)注
關(guān)注
180文章
7608瀏覽量
137123 -
編譯器
+關(guān)注
關(guān)注
1文章
1636瀏覽量
49172
發(fā)布評論請先 登錄
相關(guān)推薦
評論