還是從微機(jī)原理講起
為啥要從《微機(jī)原理》說(shuō)起呢?因?yàn)樗且槐炯兇庵v解計(jì)算機(jī)底層系統(tǒng)的的基礎(chǔ)書(shū)籍,很多有關(guān)計(jì)算機(jī)原始設(shè)計(jì)的知識(shí)都可以在這里找到答案,所以建議大家如果對(duì)計(jì)算機(jī)系統(tǒng)不太熟悉應(yīng)該多看幾遍,有些東西看著看著就會(huì)了。當(dāng)你愿意靜下心來(lái)看書(shū)籍的時(shí)候某些書(shū)本上沒(méi)有的答案你才會(huì)主動(dòng)去尋求解答,我覺(jué)得這才是真正有意義的大學(xué)學(xué)習(xí)過(guò)程。其實(shí)我們的大學(xué)教材很多是不完整的,特別是基礎(chǔ)性知識(shí),可能在注解或文后參考文獻(xiàn)才會(huì)有些提示。有些知識(shí)點(diǎn)你就不可能在教材上找得到答案,而是要去圖書(shū)館或者官方手冊(cè)或網(wǎng)站查詢(xún)才能獲得解釋。
我并不是說(shuō)編寫(xiě)教材的人水平有問(wèn)題或做的不對(duì),恰恰相反,能作為高校教材的經(jīng)典的書(shū)籍,編者的水平在國(guó)內(nèi)絕對(duì)是該領(lǐng)域有名的專(zhuān)家。他們出書(shū)安排的本意也是希望學(xué)生能夠自主學(xué)習(xí),多去了解,拓展知識(shí),畢竟教材的厚度有限,知識(shí)日新月異,涉及的幾乎無(wú)限。大學(xué)本應(yīng)該是一個(gè)自主求學(xué)的地方,那些老教授他們當(dāng)初是在基礎(chǔ)條件匱乏的環(huán)境中突破一層層障礙成長(zhǎng)起來(lái)的,寫(xiě)教材也肯定用心良苦。
只是他們的教材傳到學(xué)生手里就變成一部分人要依賴(lài)?yán)蠋焺澲攸c(diǎn)才能及格的境地,這種情況持續(xù)時(shí)間長(zhǎng)了,就總會(huì)有些是原來(lái)學(xué)的馬馬虎虎的學(xué)生來(lái)學(xué)校當(dāng)老師了,本來(lái)自己沒(méi)整明白,學(xué)生似乎也不太想整明白,到最后教的內(nèi)容就只能照著書(shū)本找答案了。當(dāng)然肯定不是所有老師都這樣,在教學(xué)的過(guò)程中很多年輕老師還是隨著資歷提升授課水平也不斷提升,前面的少數(shù)代表不了整體,所幸我在大學(xué)遇到的老師都挺好,只怪自己當(dāng)初不給力,沒(méi)能得到真?zhèn)鳎裉靹偤糜质墙處煿?jié),祝福天下老師節(jié)日快樂(lè)!
linux之父linus在大學(xué)期間設(shè)計(jì)出了第一版linux系統(tǒng),我只能說(shuō)他真是天才般的存在,那時(shí)的條件與我們所處環(huán)境相比,幾乎一個(gè)人完完整整設(shè)計(jì)出了一整套系統(tǒng),所需腦力何其巨大!在校時(shí)我還專(zhuān)門(mén)讀過(guò)他的源碼,即便一共只有萬(wàn)把行代碼,很多都難以理解的,看了這頁(yè)忘了那頁(yè)都是常事,最后也沒(méi)領(lǐng)會(huì)它的真諦,沒(méi)過(guò)多久就忘得差不多了,現(xiàn)在若有人叫我去看他的源碼,我會(huì)直截告訴他,算了吧,我真不是那塊料,我還是干好我的本分事吧。有興趣的朋友可以去看看他的代碼,但是不建議初學(xué)者看,至少能熟練運(yùn)用C語(yǔ)言,有匯編基礎(chǔ)才能看,否則對(duì)你學(xué)習(xí)百害無(wú)一利!
《微機(jī)原理》這門(mén)課程中主要是以英特爾的80x86芯片介紹來(lái)計(jì)算機(jī)的底層原理,一般情況下,計(jì)算機(jī),電子相關(guān)專(zhuān)業(yè)的同學(xué)在完成計(jì)算機(jī)基礎(chǔ)和C語(yǔ)言(或其他某高級(jí)語(yǔ)言)的學(xué)習(xí)之后,就會(huì)從微觀方面來(lái)學(xué)習(xí)計(jì)算機(jī)系統(tǒng)?!段C(jī)原理》中就會(huì)介紹計(jì)算機(jī)的數(shù)制、編碼,CPU的由來(lái),以及內(nèi)部功能結(jié)構(gòu),然后就引出了80x86芯片,這些內(nèi)容結(jié)合已學(xué)的知識(shí)多數(shù)人都應(yīng)該容易理解。

上面這個(gè)圖很眼熟吧,51單片機(jī)也有類(lèi)似結(jié)構(gòu),接著課本就進(jìn)入到了80x86指令系統(tǒng)的介紹,覺(jué)得《微機(jī)原理》很難的同學(xué)應(yīng)該就是從這開(kāi)始迷茫的吧,什么立即尋址,直接尋址,寄存器間接尋址,基址變址尋址等等一大堆讓人頭疼的概念。外加各種指令,操作符,又是地址,又是內(nèi)存,又是寄存器,存儲(chǔ)單元的,這些看這都?jí)蜓刍潄y了,老師還叫你背下來(lái)說(shuō)期末要填空,不是要了老命嗎,對(duì)不對(duì)?練習(xí)題里給你一段代碼然后給出如下圖這樣的示意圖,問(wèn)你能不能整明白啥是啥,啥等于啥?這能不暈?老師都能給你真暈。

看了上面的舉例看暈的沒(méi)?如果看暈了那我的目的就達(dá)到了,接下來(lái)我接給你整明白它。
接下來(lái)
匯編語(yǔ)言怎么對(duì)應(yīng)機(jī)器語(yǔ)言
上面說(shuō)了這么多匯編語(yǔ)言相關(guān)的內(nèi)容越說(shuō)越迷糊了,要解決疑惑,首先來(lái)認(rèn)識(shí)一下維基百科對(duì)匯編語(yǔ)言的定義。
匯編語(yǔ)言(英語(yǔ):assembly language:匯編語(yǔ)言)是任何一種用于電子計(jì)算機(jī)、微處理器、微控制器,或其他可編程器件的低級(jí)語(yǔ)言。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集。一種匯編語(yǔ)言專(zhuān)用于某種計(jì)算機(jī)系統(tǒng)結(jié)構(gòu),而不像許多高級(jí)語(yǔ)言,可以在不同系統(tǒng)平臺(tái)之間移植。
從定義可以知道的信息是:匯編可以存在于任何一種帶控制功能的芯片中,但每種控制芯片支持的匯編語(yǔ)言不一定一樣!為什么會(huì)這樣呢?芯片廠商設(shè)計(jì)一款芯片定義它的邏輯功能的同時(shí)肯定就定義好了它的操作指令,所以現(xiàn)在我們會(huì)聽(tīng)到有各種架構(gòu)的芯片存在,每一種架構(gòu)實(shí)際都是一套指令系統(tǒng),比如80x86,MIPS32,8051,AVR,RISC-V等等各種指令集,芯片廠商可以提供匯編指令集給使用者,但使用者也可以自己定義匯編指令,當(dāng)然這些使用者都是大廠啦,我們這些普通用戶(hù)就直接用廠商提供的就足夠了,像微機(jī)原理和51單片機(jī)的匯編指令都是Intel自己定義好給我們的。這也就是我們之前說(shuō)的匯編語(yǔ)言的局限性,不方便移植,今天我們就不追究這些了。
好了,再看后面一句標(biāo)紅的文字,意思就是每種芯片的匯編語(yǔ)言都對(duì)應(yīng)器上面的機(jī)器語(yǔ)言的指令,這句話才是我們搞清楚匯編語(yǔ)言的與機(jī)器語(yǔ)言關(guān)系的關(guān)鍵所在。簡(jiǎn)單的說(shuō)就是我們寫(xiě)的每一句有實(shí)際意義的匯編語(yǔ)句它就對(duì)應(yīng)一個(gè)機(jī)器碼,也就會(huì)對(duì)應(yīng)一個(gè)機(jī)器指令,CPU就根據(jù)這些連串的機(jī)器碼執(zhí)行一系列的機(jī)器操作,這就是我們寫(xiě)的程序執(zhí)行結(jié)果。先記住這句好,具體的對(duì)應(yīng)關(guān)系看后文一一介紹。那什么是有意義的匯編語(yǔ)句呢?他們就是匯編語(yǔ)言指令,也就是你不樂(lè)意記的mov,add,inc,jmp等等,那么對(duì)應(yīng)的就有一些無(wú)實(shí)際意義的匯編語(yǔ)句,我們所說(shuō)的匯編偽指令就是了,比如db,dw,equ等等,這些語(yǔ)句一般用來(lái)定義變量,或做指示,標(biāo)識(shí)用,是起輔助作用不參與程序運(yùn)行。
我們都知道,我們的51單片機(jī)是8位機(jī),所以它內(nèi)部的操作碼就有8bit,也就是說(shuō)它內(nèi)部最多可以有2^8=256個(gè)操作碼?,F(xiàn)在匯編指令確定了,操作碼總數(shù)確定了,剩下的就是一個(gè)蘿卜一個(gè)坑式的填充它們之間的對(duì)應(yīng)表了吧。
那究竟這二者之間的怎么對(duì)應(yīng)的呢?
我們可以查看一些芯片的官方手冊(cè),專(zhuān)業(yè)一點(diǎn)的廠商都會(huì)列出這些信息,有些書(shū)籍上也會(huì)有,但一般再附錄中出現(xiàn),并且內(nèi)容不會(huì)很詳細(xì),所以平時(shí)查看還是以官方手冊(cè)為準(zhǔn)。我這里貼幾個(gè)圖展示說(shuō)明一下。

這是STC數(shù)據(jù)手冊(cè)中的指令集說(shuō)明,信息是挺多的,但我們似乎還是找不到這些對(duì)應(yīng)關(guān)系,但是我們可以看到這里列出了每個(gè)匯編指令結(jié)合各種尋找方式,那機(jī)器碼應(yīng)該與這些有關(guān)吧。接下來(lái)我們繼續(xù)找資料挖掘:

可以看到,這里發(fā)現(xiàn)了代碼二字,看來(lái)離目標(biāo)越來(lái)越近了,我們是不是應(yīng)該多看看英文資料呢?

果然還是能找到信息,現(xiàn)在這個(gè)表就把他們關(guān)系都對(duì)應(yīng)上了吧!有些人可能還是看不懂這個(gè)表究竟怎么讀,舉個(gè)例子,nop指令,位于第0行第0列,組合來(lái)它對(duì)應(yīng)的機(jī)器碼值就是0x00,同樣的,ajmp指令位于第0行第1列,組合碼就是0x01??疵靼琢税?,就是一個(gè)二維數(shù)組。每個(gè)指令的各種尋址操作都在其中一一展現(xiàn),根據(jù)前面手冊(cè)中的信息就可以得到完整的對(duì)應(yīng)表了。這么看這個(gè)表還正有點(diǎn)容易犯迷糊。我們可以再做得簡(jiǎn)單易懂一些。

看這個(gè)表就簡(jiǎn)單多了吧,當(dāng)然這里例舉的只是部分表格內(nèi)容,詳細(xì)表格內(nèi)容不較多,不好全截圖,現(xiàn)在這些資料沒(méi)有整理到云盤(pán),后面再找個(gè)時(shí)間統(tǒng)一處理一下,分析鏈接出來(lái),近期需要這些資料的朋友可以私信或留言,我直接發(fā)文件。
現(xiàn)在我再來(lái)舉個(gè)例子來(lái)說(shuō)明一下,大家應(yīng)該就可以更好的理解它們。

現(xiàn)在看到這條個(gè)圖你會(huì)怎么想?你是不是首先想到去看mov指令的規(guī)則?解釋這句代碼的意思,這傻子都知道的吧。今天看了這篇文章你應(yīng)該還需要知道的是看到右邊rom中的數(shù)據(jù)就能得出左邊的匯編語(yǔ)句,這層關(guān)系想明白了嗎?
電子發(fā)燒友App








評(píng)論