51單片機(jī)進(jìn)階開發(fā)(三)之單片機(jī)底層邏輯下

簡(jiǎn)單聊聊C語(yǔ)言執(zhí)行步驟
前面寫的那篇關(guān)于了解單片機(jī)底層邏輯文章因?yàn)樯婕暗健吧願(yuàn)W”匯編語(yǔ)言所以看的人沒多少,理解了的朋友估計(jì)就更少了吧,最后剩下兩個(gè)問題也一直沒寫,今天就做個(gè)了結(jié)吧。我們初學(xué)C語(yǔ)言時(shí)老師肯定講過C語(yǔ)言的執(zhí)行過程:預(yù)處理——編譯——匯編——鏈接。就這四個(gè)步驟,說簡(jiǎn)單吧,應(yīng)該就是賊簡(jiǎn)單的;說復(fù)雜呢,可以寫一本書,幸好已經(jīng)有前輩寫了關(guān)于這一部分內(nèi)容的經(jīng)典巨著了。所以今天又來(lái)推薦去讀書的,這本書被稱為龍書,叫做《編譯原理》,值得編程人員去讀,特別是計(jì)算機(jī)專業(yè)的研究生更值得一看了。我寫的內(nèi)容絕對(duì)不會(huì)比書中寫得詳細(xì)具體,所以今天這里就簡(jiǎn)單說吧,用一張圖說明今天所有內(nèi)容:


上圖已經(jīng)很清楚的說明了C語(yǔ)言轉(zhuǎn)化匯編的方法以及匯編轉(zhuǎn)機(jī)器語(yǔ)言的方法了,所以問題可算是over了。
是否更加云里霧里
圖已看,問題關(guān)系也說明了,但更迷糊了不?其實(shí)隨便一個(gè)C語(yǔ)言編譯器都能幫我們理解這個(gè)過程。因?yàn)橹灰幾gC語(yǔ)言就不得不具備圖中的這些工具,不管是你用的是VC6.0,還是VS,或是GCC,甚至是Keil。
因?yàn)槲覀冞@里是講單片機(jī)所以接下來(lái)我們就以keil為例做個(gè)說明,先上個(gè)圖:

我們編譯通過的程序編譯器軟件會(huì)自動(dòng)生成對(duì)應(yīng)的文件,甚至在這個(gè)生成的文件中機(jī)器代碼都已經(jīng)給到了我們,并且哪句C語(yǔ)言代碼對(duì)應(yīng)的匯編指令都一一對(duì)應(yīng)了。所以通過這個(gè)文件我們就可以很清楚的知道C語(yǔ)言與匯編語(yǔ)言的對(duì)應(yīng)關(guān)系,匯編語(yǔ)言與機(jī)器語(yǔ)言的對(duì)應(yīng)關(guān)系。通過分析這個(gè)文件就能幫我們更好的理解單片機(jī)的執(zhí)行過程,也有助于我們進(jìn)一步理解匯編語(yǔ)言。到最后我們的程序成功編譯之后我們通常都是把HEX文件下載到單片機(jī)中運(yùn)行,那hex文件又是怎么回事呢?
HEX文件解讀
在這里hex文件就是我們程序編譯出來(lái)的目標(biāo)文件,它存儲(chǔ)的是一些按一定規(guī)則組合起來(lái)的機(jī)器代碼。就像最原始的機(jī)器代碼是以紙為媒介存儲(chǔ)一樣,hex文件也相當(dāng)于機(jī)器代碼的一種存儲(chǔ)媒介,當(dāng)我們要將文件下載到單片機(jī)時(shí),下載軟件會(huì)對(duì)其進(jìn)行解析,最后將其存儲(chǔ)的機(jī)器代碼裝載到單片機(jī)的flash中。當(dāng)然HEX文件不止一種規(guī)則,不過我們一般用到的規(guī)則都是intel公司的,其他的規(guī)則可自行了解。下面以intel公司的hex文件規(guī)則進(jìn)行說明。
舉例一段HEX內(nèi)容說明:?

解釋:冒號(hào)為每行數(shù)據(jù)的開始符號(hào);藍(lán)色表示此行數(shù)據(jù)長(zhǎng)度,十六進(jìn)制,如0E就是14;紅色是數(shù)據(jù)存放的地址,如0003;粉紅色是表示數(shù)據(jù)類型,00表示數(shù)據(jù)記錄,01表示文件結(jié)束,02表示擴(kuò)展段地址記錄,03表示開始段地址記錄,04表示擴(kuò)展線性地址記錄,05表示開始線性地址記錄;后面緊跟著的是N位數(shù)據(jù),長(zhǎng)度由藍(lán)色的長(zhǎng)度位決定;天藍(lán)色為校驗(yàn)位。

對(duì)比這張圖片內(nèi)容和上一張keil軟件生成的文件圖片你發(fā)現(xiàn)了說明信息?
我想通過今天的內(nèi)容你心中應(yīng)該對(duì)單片機(jī)代碼執(zhí)行過程有一定了解了吧?如果還是不懂,就多去調(diào)試一下代碼吧,調(diào)多了你自然而然就懂了。另外,通過機(jī)器代碼我們也可以推導(dǎo)出匯編程序,進(jìn)而可以編出C語(yǔ)言代碼。到此你是否就懂了黑客破解軟件的原理了?是否明白程序加密的重要性了?是否懂了那些抄芯片的人工作內(nèi)容是啥了嗎?所以現(xiàn)在是否恍然大悟了呢?總之懂得單片機(jī)底層原理對(duì)我們理解程序執(zhí)行還是很重要的,當(dāng)然這也是編譯原理的基礎(chǔ)。